SELECT Postgres JSONB 字段中不为空的值

SELECT values which are not null from JSONB field in Postgres

我无法 select Postgres 9.5 中 JSONB 字段中 属性 的非空值

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

我也试过使用 NOTNULL。

当我 运行 其中一个时,我收到错误 42883。 "ERROR: Operator does not exist. JSONB->>boolean Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts."

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

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", <b>"property": null</b>}');
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", <b>"property": null</b>}
(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 <b>data->'property'</b> IS NOT NULL;

即测试 NULLjsonb 值,而不是将其转换为 text。更有效,当然是在更大的桌子上。这显然只适用于真正的 nulls.

首先检查 JSON 键不为空(使用单个 ->),重要的是先检查。

然后检查该值是否为空(使用双 ->>)有一些可能的空值所以添加检查你认为空的任何东西

所以查询变成了。

SELECT data->>'property' 
FROM mytable 
WHERE data->'property' IS NOT NULL
    AND data->>'property' <> ''
    AND data->>'property' <> '{}'
    AND data->>'property' <> '[]';