提问者:小点点

从Postgres中的JSONB字段中选择非空值


在Postgres9.5中,我无法从JSONB字段中的属性中选择非空值

从mytable中选择data->>“property”,其中data->>“property”不为空;

我还尝试使用NotNull。

当我运行其中一个时,我收到错误42883。“错误:运算符不存在。JSONB->>布尔提示:没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换。”


共1个答案

匿名用户

我很快测试了一下你的问题,没有发现问题:

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而是一个空字符串或类似于''(字符串)的东西,那么您应该调整测试以查找以下内容:where data->>'property'=''。如果是这种情况,您可以考虑使用jsonb_set()将这些值设置为真jsonnull

顺便说一句,您还可以:

SELECT data->>'property' FROM mytable WHERE data->'property' IS NOT NULL;

即测试jsonb值是否为null而不是将其转换为text。更有效率,当然是在更大的桌子上。这显然只适用于truenulls。