我无法从Postgres 9.5中的JSONB字段内的属性中选择非空值
SELECT data->>'property' FROM mytable WHERE data->>'property' IS NOT NULL;
我也尝试过使用NOTNULL。
当我运行其中任何一个时,我收到错误42883。 “错误:运算符不存在.JSONB->>布尔提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。”
答案 0 :(得分:9)
我很快测试了你的问题并发现没问题:
patrick@brick:~$ 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)
请注意,在jsonb
中,应在输入时精确指定NULL
值(如上例所示),而不是某些引用版本。如果值不是NULL
而是空字符串或类似'<null>'
(字符串),那么您应该调整测试以查找:WHERE data->>'property' = ''
。如果是这种情况,您可以考虑使用jsonb_set()
将此类值设置为真正的json null
。
顺便说一句,您也可以这样做:
SELECT data->>'property' FROM mytable WHERE data->'property' IS NOT NULL;
即。测试jsonb
的{{1}}值,而不是其NULL
。更高效,当然在更大的桌子上。这显然只适用于真text
s。