La tua richiesta è vicina. json_each()
è la funzione chiave. Oppure jsonb_each()
per jsonb
. Un paio di miglioramenti:
SELECT *
FROM things t
WHERE EXISTS (
SELECT FROM json_each(t.blueprint) b
WHERE b.value->>'name' ILIKE 'azamund'
);
Vecchio sqlfiddle
db<>violino qui
-
json_each()
restituisce già il valore comejson
tipo di dati. Non c'è bisogno di un cast aggiuntivo. -
Meglio, ancora, usa un
LATERAL
riferimento inEXISTS
. Questo è molto più pulito che annullare l'annidamento con una funzione di ritorno di set inSELECT
elenco. Correlati: -
Usa
ILIKE
(~~*
) per la corrispondenza del modello. Corrispondenze di espressioni regolari (~
,~*
) sono più potenti, ma anche più costosi. Quindi usa ilLIKE
di base /ILKE
dove puoi. Dettagli:
Alternativa con array JSON
Hai già visto la mia risposta correlata per gli array JSON:
- Come posso eseguire query utilizzando i campi all'interno del nuovo tipo di dati JSON di PostgreSQL?
Anche se la query per gli oggetti JSON nidificati sembra altrettanto semplice, esiste un supporto per gli indici superiore per l'array:
Può diventare più semplice/più efficiente con SQL/JSON in Postgres 12 ...