jsonb
Postgres 9.4以降
Postgres 9.4のjsonb
データ型を検討してください-「バイナリ」の「b」。特に、には等価演算子があります。ほとんどの人は切り替えたくなるでしょう。=
jsonb
jsonbに関するDepeszブログ。
json
値全体の同等性を確立するための明確に定義された方法がないため=
、データ型に定義された演算子はありません。ただし、以下を参照してください。json
json
あなたは可能性にキャストtext
してから使用し=
作業を。これは短いですが、テキスト表現がたまたま一致する場合にのみ機能します。コーナーケースを除いて、本質的に信頼できません。見る:
またはunnest
、配列を作成して->>
演算子を使用し、get JSON object field as text
個々のフィールドを比較することができます。
テストテーブル
2行:最初の質問のようなもの、2番目の行は単純な値。
CREATE TABLE tbl (
tbl_id int PRIMARY KEY
, jar json[]
);
INSERT INTO t VALUES
(1, '{"{\"value\" : \"03334/254146\", \"typeId\" : \"ea4e7d7e-7b87-4628-ba50-f5\"}"
,"{\"value\" : \"03334/254147\", \"typeId\" : \"ea4e7d7e-7b87-4628-ba50-f6\"}"
,"{\"value\" : \"03334/254148\", \"typeId\" : \"ea4e7d7e-7b87-4628-ba50-f7\"}"}')
, (2, '{"{\"value\" : \"a\", \"typeId\" : \"x\"}"
,"{\"value\" : \"b\", \"typeId\" : \"y\"}"
,"{\"value\" : \"c\", \"typeId\" : \"z\"}"}');
デモ
デモ1:あなたは可能性が使用array_remove()
してtext
表現(信頼できません)。
SELECT tbl_id
, jar, array_length(jar, 1) AS jar_len
, jar::text[] AS t, array_length(jar::text[], 1) AS t_len
, array_remove(jar::text[], '{"value" : "03334/254147", "typeId" : "ea4e7d7e-7b87-4628-ba50-f6"}'::text) AS t_result
, array_remove(jar::text[], '{"value" : "03334/254147", "typeId" : "ea4e7d7e-7b87-4628-ba50-f6"}'::text)::json[] AS j_result
FROM tbl;
デモ2:個々の要素の配列とテストフィールドのネストを解除します。
SELECT tbl_id, array_agg(j) AS j_new
FROM tbl, unnest(jar) AS j -- LATERAL JOIN
WHERE j->>'value' <> '03334/254146'
AND j->>'typeId' <> 'ea4e7d7e-7b87-4628-ba50-6a5f6e63dbf5'
GROUP BY 1;
デモ3:行タイプを使用した代替テスト。
SELECT tbl_id, array_agg(j) AS j_new
FROM tbl, unnest(jar) AS j -- LATERAL JOIN
WHERE (j->>'value', j->>'typeId') NOT IN (
('03334/254146', 'ea4e7d7e-7b87-4628-ba50-6a5f6e63dbf5')
,('a', 'x')
)
GROUP BY 1;
UPDATE
要求通り
最後に、これは次のように実装できますUPDATE
。
UPDATE tbl t
SET jar = j.jar
FROM tbl t1
CROSS JOIN LATERAL (
SELECT ARRAY(
SELECT j
FROM unnest(t1.jar) AS j -- LATERAL JOIN
WHERE j->>'value' <> 'a'
AND j->>'typeId' <> 'x'
) AS jar
) j
WHERE t1.tbl_id = 2 -- only relevant rows
AND t1.tbl_id = t.tbl_id;
ここに db <> fiddle
暗黙についてLATERAL JOIN
:
配列のネスト解除について:
DB設計
状況を単純化するために、正規化されたスキーマを検討しjson
ます。メインのテーブルとの1:1の関係で結合された、値(配列列ではなく)の個別のテーブルです。