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;
即测试 NULL
的 jsonb
值,而不是将其转换为 text
。更有效,当然是在更大的桌子上。这显然只适用于真正的 null
s.
首先检查 JSON 键不为空(使用单个 ->),重要的是先检查。
然后检查该值是否为空(使用双 ->>)有一些可能的空值所以添加检查你认为空的任何东西
所以查询变成了。
SELECT data->>'property'
FROM mytable
WHERE data->'property' IS NOT NULL
AND data->>'property' <> ''
AND data->>'property' <> '{}'
AND data->>'property' <> '[]';
我无法 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;
即测试 NULL
的 jsonb
值,而不是将其转换为 text
。更有效,当然是在更大的桌子上。这显然只适用于真正的 null
s.
首先检查 JSON 键不为空(使用单个 ->),重要的是先检查。
然后检查该值是否为空(使用双 ->>)有一些可能的空值所以添加检查你认为空的任何东西
所以查询变成了。
SELECT data->>'property'
FROM mytable
WHERE data->'property' IS NOT NULL
AND data->>'property' <> ''
AND data->>'property' <> '{}'
AND data->>'property' <> '[]';