Postgresql

匹配 JSON 數組的元素

  • July 17, 2017

這是一個範例表:

create table test(
   id int,
   json_key json[]
);

insert into test (id,json_key) values
   (1,array['{"key1":"123"}'::json,'{"key2":"456"}'::json]),
   (2,array['{"key1":"789"}'::json,'{"key2":"456"}'::json]);

json_key 輸出為:

{{"key1":"123"},{"key2":"456"}}

我正在嘗試執行

select * from test 
where json_key->>'key2'='456';

但它不起作用:(我怎樣才能執行這個查詢?

嘗試將某些內容與數組元素匹配的一種方法是使用ANY. 唯一的事情是找到可以與之一起使用的正確運算符。在這種情況下,<@將成為我們的朋友(您可以在文件的正確頁面找到它和其他人)。完成後,它變得容易:

SELECT * FROM test WHERE '{"key2": "456"}'::jsonb <@ ANY(json_key::jsonb[]);

id │                  json_key                   
────┼─────────────────────────────────────────────
 1 │ {"{\"key1\":\"123\"}","{\"key2\":\"456\"}"}
 2 │ {"{\"key1\":\"789\"}","{\"key2\":\"456\"}"}

為了證明它確實符合我們的預期:

test=# SELECT * FROM test WHERE '{"key1": "456"}'::jsonb <@ ANY(json_key::jsonb[]);

id │ json_key 
────┼──────────

test=# SELECT * FROM test WHERE '{"key1": "123"}'::jsonb <@ ANY(json_key::jsonb[]);

id │                  json_key                   
────┼─────────────────────────────────────────────
 1 │ {"{\"key1\":\"123\"}","{\"key2\":\"456\"}"}

在dbfiddle上觀看它的實際操作。

引用自:https://dba.stackexchange.com/questions/179990