Postgresql 从Postgres中的JSONB字段中选择不为空的值

Postgresql 从Postgres中的JSONB字段中选择不为空的值,postgresql,jsonb,Postgresql,Jsonb,我无法从Postgres 9.5中JSONB字段内的属性中选择非空值 从mytable中选择data->>“property”,其中data->>“property”不为空 我还尝试使用NOTNULL 当我运行其中一个时,我收到错误42883。“错误:运算符不存在。JSONB->>布尔提示:没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换。”我快速测试了您的问题,没有发现任何问题: patrick@brick:~$ psql -d test psql (9.5.0) Type "

我无法从Postgres 9.5中JSONB字段内的属性中选择非空值

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

我还尝试使用NOTNULL


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

我快速测试了您的问题,没有发现任何问题:

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)

i、 e.测试
jsonb
值是否为
NULL
,而不是将其转换为
text
。更高效,当然是在更大的桌子上。这显然只适用于true
null
s。

不幸的是,我不能在这里发布JSON,但我可以发表一些评论。1.JSONB上的其他查询工作正常。2.看起来JSON的这个特定属性中的大多数数据都是被定义的,因为我认为我的JSON属性没有像您发布的那样被设置为
null
。有没有办法检查空字符串?+用于提及->而不是文本类型转换(->>),因为大多数人只是在不需要额外开销的情况下通过类型转换复制示例!你确定不使用9.4吗?在9.4中,
->
运算符的优先级低于
为[NOT]NULL
(因此您的查询被解析为
数据->>('property'不为NULL
)。我现在没有9.5实例要测试,但(从@Patrick的回答来看)这可能是9.5中引入的一个改进。在9.4中,最简单的解决方法是使用括号:
(数据->>'property')不为空
。确实发生了变化:vs.(
->
->
在(任何其他)运算符中)。
SELECT data->>'property' FROM mytable WHERE data->'property' IS NOT NULL;