Ho una tabella, personsche contiene due colonne, una ide una basata su JSONB data(questa tabella è stata appena creata a scopo dimostrativo per giocare con il supporto JSON di PostgreSQL).
Ora, suppongo che contenga due record:
1, { name: 'John', age: 30 }
2, { name: 'Jane', age: 20 }
Ora, suppongo che voglio ottenere il nome di ogni persona di età superiore ai 25 anni. Quello che ho provato è:
select data->'name' as name from persons where data->'age' > 25
Sfortunatamente, questo provoca un errore. Posso risolverlo usando ->>invece di ->, ma poi i confronti non funzionano più come previsto, dal momento che non vengono confrontati i numeri, ma le loro rappresentazioni come stringhe:
select data->'name' as name from persons where data->>'age' > '25'
Ho quindi capito che posso effettivamente risolvere il problema utilizzando ->e un cast per int:
select data->'name' as name from persons where cast(data->'age' as int) > 25
Funziona, ma non è così bello che devo conoscere il tipo reale (il tipo di agenel documento JSON è numbercomunque, quindi perché PostgreSQL non riesce a capirlo da solo?).
Ho quindi capito che se convertivo manualmente in textusando la ::sintassi, anche tutto funziona come previsto, anche se ora stiamo confrontando nuovamente le stringhe.
select data->'name' as name from persons where data->'age'::text > '25'
Se poi provo questo con il nome anziché l'età, non funziona:
select data->'name' as name from persons where data->'name'::text > 'Jenny'
Ciò provoca un errore:
sintassi di input non valida per il tipo json
Abbastanza ovviamente, non capisco qualcosa qui. Sfortunatamente, è abbastanza difficile trovare esempi reali di utilizzo di JSON con PostgreSQL.
Qualche suggerimento?
'Jenny'con '"Jenny"'.
data->'name'::text, stai lanciando la'name'stringa in testo, non nel risultato. Non si ottiene un errore se confrontato con'25'perché25è un valore letterale JSON valido; maJennynon lo è (anche se"Jenny"sarebbe).