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

she*_*ger 11 postgresql jsonb

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

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

我也尝试过使用NOTNULL.

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

Pat*_*ick 11

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

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)
Run Code Online (Sandbox Code Playgroud)

请注意,在jsonb一个NULL值应该被指定正是如此输入(如上面的例子中),而不是在一些引用的版本.如果值不是NULL空字符串或类似'<null>'(字符串),那么你应该调整你的测试来寻找:WHERE data->>'property' = ''.如果是这种情况,您可以考虑使用jsonb_set()将这些值设置为真正的json null.

顺便说一下,你也可以这样做:

SELECT data->>'property' FROM mytable WHERE data->'property' IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

即测试jsonbNULL而不是其强制转换为text.更高效,当然在更大的桌子上.这显然只适用于真实null的.


小智 5

首先检查 JSON 键不为空(使用单个 ->),这一点很重要。

然后检查该值是否为空(使用 double ->>),有一些可能的空值,因此请添加检查以检查您认为为空的内容

所以所提出的查询就变成了。

SELECT data->>'property' 
FROM mytable 
WHERE data->'property' IS NOT NULL
    AND data->>'property' <> ''
    AND data->>'property' <> '{}'
    AND data->>'property' <> '[]';
Run Code Online (Sandbox Code Playgroud)