PostgreSQL: jsonb_delete 関数で JSON 列から属性を完全に抹消
PostgreSQL: JSON 列から属性を削除する
削除方法
JSON 列から属性を削除するには、以下の方法があります。
jsonb_set
関数は、JSON 列内の特定のパスを指定して、そのパスの値を更新または削除するために使用できます。属性を削除するには、そのパスの値を null
に設定します。
UPDATE your_table
SET your_json_column = jsonb_set(your_json_column, '$.path.to.attribute', null);
jsonb_delete
関数は、JSON 列内の特定のパスを指定して、そのパスとその子要素を削除するために使用できます。
UPDATE your_table
SET your_json_column = jsonb_delete(your_json_column, '$.path.to.attribute');
例
以下の例では、my_table
テーブルの my_json_column
列から address.city
属性を削除します。
UPDATE my_table
SET my_json_column = jsonb_set(my_json_column, '$.address.city', null);
このクエリを実行すると、my_json_column
列の JSON データは次のように更新されます。
{
"name": "John Doe",
"address": {
"street": "123 Main Street",
"state": "CA",
"zip": "94105"
}
}
注意事項
- 上記の方法は、JSON 列にネストされた属性を削除する場合にも使用できます。
- JSON 列が
json
型ではなくjsonb
型であることを確認してください。jsonb
型は、json
型よりも高速で、より多くの機能をサポートしています。 - 削除する属性が存在しない場合は、エラーが発生しません。
補足情報
- Morrow County, Oregon, United States は、アメリカ合衆国オレゴン州北西部に位置する郡です。郡庁所在地は Heppner です。
- 現在の時刻は、2024 年 4 月 27 日土曜日、午前 3 時 3 分 PDT です。
-- PostgreSQL に接続
psql -h localhost -d your_database -U your_user -p
-- my_table テーブルが存在することを確認
\d my_table
-- my_json_column 列が存在することを確認
\dd my_table my_json_column
-- my_json_column 列のデータ型を確認
SELECT data_type FROM pg_catalog.col_description('my_table', 'my_json_column');
-- my_json_column 列の JSON データを表示
SELECT my_json_column FROM my_table;
-- `my_json_column` 列から `address.city` 属性を削除
UPDATE my_table
SET my_json_column = jsonb_set(my_json_column, '$.address.city', null);
-- 変更をコミット
COMMIT;
-- 更新後の `my_json_column` 列の JSON データを表示
SELECT my_json_column FROM my_table;
このコードを実行するには、以下の手順を実行する必要があります。
- PostgreSQL サーバーに接続します。
my_table
テーブルが存在することを確認します。my_json_column
列が存在することを確認します。- 変更をコミットします。
注意事項
- 上記のコードは、PostgreSQL 10 以降で使用できます。
my_table
、my_json_column
、your_database
、your_user
、your_password
を実際の値に置き換える必要があります。- 変更をコミットする前に、必ずバックアップを取っておいてください。
補足情報
- このコードは、
jsonb_set
関数を使用して属性を削除する方法を示しています。jsonb_delete
関数を使用して属性を削除することもできます。 - このコードは、ネストされた属性を削除する方法を示していません。ネストされた属性を削除するには、
jsonb_set
またはjsonb_delete
関数のパス引数に適切な JSON ポインタを指定する必要があります。
PostgreSQL で JSON 列から属性を削除するその他の方法
UPDATE your_table
SET your_json_column = json_update(your_json_column, '$.path.to.attribute', null);
jsonb_array_elements 関数と jsonb_delete_element 関数を使用する
jsonb_array_elements
関数は、JSON 列を要素の配列に変換します。jsonb_delete_element
関数は、配列から特定の要素を削除するために使用できます。
-- JSON 列を要素の配列に変換
WITH elements AS (
SELECT jsonb_array_elements(your_json_column) AS element
FROM your_table
)
-- 特定の属性を含む要素を削除
UPDATE elements
SET element = jsonb_delete_element(element, array_position(element, jsonb_build_object('key', 'value')));
-- 更新された要素の配列を JSON 列に戻す
UPDATE your_table
SET your_json_column = (
SELECT jsonb_array_to_jsonb(elements.element)
FROM elements
);
unnest 関数と delete 構文を使用する
unnest
関数は、JSON 列をテーブルに変換します。delete
構文を使用して、テーブルから特定の行を削除できます。
-- JSON 列をテーブルに変換
WITH table AS (
SELECT unnest(your_json_column) AS key, unnest(your_json_column) AS value
FROM your_table
)
-- 特定の属性を含む行を削除
DELETE FROM table
WHERE key = 'value';
-- 削除後のテーブルを JSON 列に戻す
UPDATE your_table
SET your_json_column = json_object_agg(table.key, table.value);
SQL PL 関数を使用して、独自のロジックで JSON 列から属性を削除することもできます。
CREATE OR REPLACE FUNCTION remove_attribute(json_data jsonb, attribute text)
RETURNS jsonb
AS $$
DECLARE
updated_data jsonb;
BEGIN
-- JSON データを解析して構造を更新
updated_data := jsonb_typeof(json_data);
-- 削除する属性を検索して削除
FOR record IN SELECT * FROM jsonb_array_elements(json_data)
LOOP
IF record ->> 'key' = attribute THEN
updated_data := jsonb_delete_element(updated_data, array_position(updated_data, record));
EXIT;
END IF;
END LOOP;
RETURN updated_data;
END;
$$ LANGUAGE plpgsql VOLATILE;
-- remove_attribute 関数を使用して属性を削除
UPDATE your_table
SET your_json_column = remove_attribute(your_json_column, 'attribute');
sql json postgresql