여러 값에 대한 PostgreSQL JSON 쿼리 배열 배열이 해당 그룹을

jsonbPostgres 에서 유형에 대한 쿼리를 작성하여 고객 ID 배열이 해당 그룹을 찾습니다.

이 예제 테이블이 주어지면 :

CREATE TABLE grp(d JSONB NOT NULL);

INSERT INTO grp VALUES
   ('{"name":"First","arr":["foo"], "customers":[{"id":"1", "name":"one"},{"id":"2", "name":"two"}]}')
 , ('{"name":"Second","arr":["foo","bar"], "customers":[{"id":"3", "name":"three"},{"id":"4", "name":"four"}]}')
 , ('{"name":"Third","arr":["bar","baz"], "customers":[{"id":"5", "name":"five"},{"id":"6", "name":"seven"}]}');

비슷한 질문 ( 여러 값에 대한 PostgreSql JSONB SELECT)을 발견 하고이 쿼리를 사용하여 간단한 배열에서 원하는 것을 달성했습니다.

SELECT d FROM grp WHERE d->'arr' ?| ARRAY['foo', 'bar'];

그러나 배열에 JSON 객체 가 포함되어 있으면 작동하지 않습니다 .

SELECT d FROM grp WHERE d->'customers' ?| ARRAY['{"id":"1"}', '{"id":"5"}'];

내 쿼리에서 기대하는 내용은 다음과 같습니다.

grp “First”-> 고객 “1”

grp “Third”-> 고객 “5”



답변

방법이 있습니다 : 포함 연산자@>ANY구문 과 결합하십시오 :

SELECT d
FROM   grp
WHERE  d->'customers' @> ANY (ARRAY ['[{"id":"1"}]', '[{"id":"5"}]']::jsonb[]);

또는:

...
WHERE d->'customers' @> ANY ('{"[{\"id\": \"1\"}]","[{\"id\": \"5\"}]"}'::jsonb[]);

배열을 jsonb[]명시 적으로 캐스팅해야합니다 . 그리고 각 요소는 연산자 가 요구 하는 내부 의 JSON 배열@> 입니다. JSON 배열의 배열입니다.

이를 위해 색인을 사용할 수 있습니다.

매뉴얼은 명시 적으로 언급 운영자가 있음을 ?|위한 문자열 만.