Ho provato subito la tua domanda e hanno trovato nessun problema:
[email protected]:~$ psql -d test
psql (9.5.0)
Type "help" for help.
test=# CREATE TABLE mytable (id serial PRIMARY KEY, data jsonb);
CREATE TABLE
test=# INSERT INTO mytable (data) VALUES
('{"ip": "192.168.0.1", "property": "router"}'),
('{"ip": "127.0.0.1", "property": "localhost"}'),
('{"ip": "192.168.0.15", "property": null}');
INSERT 0 3
test=# SELECT * FROM mytable;
id | data
----+----------------------------------------------
1 | {"ip": "192.168.0.1", "property": "router"}
2 | {"ip": "127.0.0.1", "property": "localhost"}
3 | {"ip": "192.168.0.15", "property": null}
(3 rows)
test=# SELECT data->>'property' FROM mytable WHERE data->>'property' IS NOT NULL;
?column?
-----------
router
localhost
(2 rows)
Si noti che in jsonb
un valore NULL
dovrebbe essere specificato con precisione così via di ingresso (come nell'esempio sopra), non in qualche versione citata. Se il valore non è NULL
ma una stringa vuota o qualcosa di simile a '<null>'
(una stringa), allora dovresti adattare il test per cercare che: WHERE data->>'property' = ''
. Se questo è il caso, potresti prendere in considerazione l'utilizzo di jsonb_set()
per impostare tali valori su un vero jeff null
.
Per inciso, si potrebbe anche fare:
SELECT data->>'property' FROM mytable WHERE data->'property' IS NOT NULL;
cioè testare il valore jsonb
per NULL
piuttosto che il suo cast di text
. Più efficiente, certamente su tavoli più grandi. Questo ovviamente funziona solo su true null
s.
Grazie, copia/incolla fallita. – sheldonkreger
Sei sicuro di non usare 9.4? Nel 9.4 l'operatore '- >>' ha precedenza inferiore rispetto a 'IS [NOT] NULL' (quindi la tua query viene analizzata come 'data - >> (' property 'IS NOT NULL')). Non ho ora istanza 9.5 da testare, ma sembra (dalla risposta di @Patrick) che questo potrebbe essere un miglioramento introdotto in 9.5. In 9.4 la soluzione più semplice è usare le parentesi: '(data - >> 'property') IS NOT NULL'. – pozs
Il cambiamento è effettivamente avvenuto: [9.4] (http://www.postgresql.org/docs/9.4/static/sql-syntax-lexical.html#SQL-PRECEDENCE-TABLE) vs. [9.5] (http: // www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-PRECEDENCE-TABLE) ('->' e '- >>' si trova all'interno dell'operatore * (qualsiasi altro) *). – pozs