[解決済み] PostgreSQL。JSONカラムから属性を削除する
質問
json型のカラムからいくつかの属性を削除したい。
テーブルの
CREATE TABLE my_table( id VARCHAR(80), data json);
INSERT INTO my_table (id, data) VALUES (
'A',
'{"attrA":1,"attrB":true,"attrC":["a", "b", "c"]}'
);
さて、ここで
attrB
をカラムから
data
.
次のようなものです。
alter table my_table drop column data->'attrB';
のようなものがあればいいと思います。でも、テンポラリテーブルを使った方法でも十分です。
どのように解決するのですか?
更新
: 9.5+では、明示的に
jsonb
(もし、あなたが
json
型のカラムがある場合、キャストを使用して修正を適用することができます)。
JSON オブジェクト (または配列) からキー (またはインデックス) を削除する場合は
-
演算子で行うことができます。
SELECT jsonb '{"a":1,"b":2}' - 'a', -- will yield jsonb '{"b":2}'
jsonb '["a",1,"b",2]' - 1 -- will yield jsonb '["a","b",2]'
JSONの階層の深いところからの削除は
#-
演算子を使うことができます。
SELECT '{"a":[null,{"b":[3.14]}]}' #- '{a,1,b,0}'
-- will yield jsonb '{"a":[null,{"b":[]}]}'
9.4では、元の答えの修正版(以下)を使うことができますが、JSON文字列を集約する代わりに
json
オブジェクトに直接
json_object_agg()
.
関連項目: PostgreSQL内での他のJSON操作。
オリジナルの回答 (PostgreSQL 9.3にも適用されます)。
少なくともPostgreSQL 9.3を持っていれば、オブジェクトをペアに分割して
json_each()
でペアに分割し、不要なフィールドをフィルタリングして、再度jsonを手動で構築することができます。こんな感じ。
SELECT data::text::json AS before,
('{' || array_to_string(array_agg(to_json(l.key) || ':' || l.value), ',') || '}')::json AS after
FROM (VALUES ('{"attrA":1,"attrB":true,"attrC":["a","b","c"]}'::json)) AS v(data),
LATERAL (SELECT * FROM json_each(data) WHERE "key" <> 'attrB') AS l
GROUP BY data::text
9.2 (またはそれ以下) では不可能です。
編集 :
より便利なのは、関数を使って
json
フィールドの属性をいくつでも削除できる関数を作ることです。
編集2
:
string_agg()
よりも安価である。
array_to_string(array_agg())
CREATE OR REPLACE FUNCTION "json_object_delete_keys"("json" json, VARIADIC "keys_to_delete" TEXT[])
RETURNS json
LANGUAGE sql
IMMUTABLE
STRICT
AS $function$
SELECT COALESCE(
(SELECT ('{' || string_agg(to_json("key") || ':' || "value", ',') || '}')
FROM json_each("json")
WHERE "key" <> ALL ("keys_to_delete")),
'{}'
)::json
$function$;
この機能を使えば、あとは以下のクエリを実行するだけです。
UPDATE my_table
SET data = json_object_delete_keys(data, 'attrB');
関連
-
plsql-stored-procedure ORA-06550 エラー処理
-
[解決済み] 正しいJSONコンテンツタイプは何ですか?
-
[解決済み] JSONでコメントを使用することはできますか?
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] PostgreSQLの場合。PostgreSQLのテーブルを表示する
-
[解決済み] PostgreSQLの "DESCRIBE TABLE"
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] MySQLの「スキーマの作成」と「データベースの作成」 - 違いはあるのか?
-
[解決済み] 各GROUP BYグループの最初の行を選択しますか?
-
[解決済み] SQL Serverでストアドプロシージャ内のテキストを検索する
-
[解決済み] SQLの複数列の順序付け
-
[解決済み] mysqldumpで特定のテーブルをスキップする
-
[解決済み] PostgreSQLで一重引用符で囲まれたテキストを挿入する
-
[解決済み] 複数の列に対してSELECT DISTINCTする方法(またはできる方法)は?
-
[解決済み] SQLサーバーで行を列に効率的に変換する
-
[解決済み] 別のテーブルに一致する項目がない行を選択するにはどうすればよいですか?
-
[解決済み】新しいPostgreSQL JSONデータ型内のフィールドを変更するにはどうすればよいですか?