Ho una tabella, persons
che contiene due colonne, una id
e 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 age
nel documento JSON è number
comunque, quindi perché PostgreSQL non riesce a capirlo da solo?).
Ho quindi capito che se convertivo manualmente in text
usando 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; maJenny
non lo è (anche se"Jenny"
sarebbe).