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 comejsontipo di dati. Non c'è bisogno di un cast aggiuntivo. -
Meglio, ancora, usa un
LATERALriferimento inEXISTS. Questo è molto più pulito che annullare l'annidamento con una funzione di ritorno di set inSELECTelenco. Correlati: -
Usa
ILIKE(~~*) per la corrispondenza del modello. Corrispondenze di espressioni regolari (~,~*) sono più potenti, ma anche più costosi. Quindi usa ilLIKEdi base /ILKEdove 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 ...