Matrice di query JSON PostgreSQL rispetto a più valori


17

Voglio scrivere una query contro il jsonbtipo in Postgres che, dato un array di ID clienti, troverà i gruppi corrispondenti.

Dato questa tabella di esempio:

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"}]}');

Ho trovato una domanda simile ( PostgreSql JSONB SELECT su più valori ) e sono riuscito a ottenere ciò che desidero su un array semplice usando questa query:

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

Tuttavia, non riesco a farlo funzionare quando l'array contiene oggetti JSON :

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

Ecco cosa mi aspetto dalla mia domanda:

grp "Primo" -> cliente "1"

grp "Terzo" -> cliente "5"

Risposte:


16

C'è un modo: combina l' operatore di contenimento@> con il ANYcostrutto :

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

O:

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

È essenziale eseguire il cast dell'array in modo jsonb[]esplicito. E nota che ogni elemento è un array JSON all'interno come @>richiede l'operatore . Quindi è una matrice di array JSON.

È possibile utilizzare un indice per questo:

Il manuale afferma esplicitamente che l'operatore ?|è solo per stringhe .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.