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

标签 postgresql jsonb

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

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

我也试过使用 NOTNULL。

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

最佳答案

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

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;

即测试 jsonb NULL 的值而不是将其转换为 text .更有效,当然是在更大的 table 上。这显然只适用于 true null

关于postgresql - 从 Postgres 的 JSONB 字段中选择不为空的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34984938/

相关文章:

postgresql - 从边界框(内部和重叠)中提取几何图形并将结果复制到新的空数据库

python - Django queryset iterator() 无法按预期工作

json - 对未知键的 Postgres JSON 查询

arrays - PostgreSQL 跨多行计算 jsonb 数组中的结果

postgresql - 具有异构数据类型的 3 个字段的多列索引

ruby-on-rails - 需要一个在非空值之后返回空值的 postgresql 查询

json - Postgres : Range Query on nested jsonb column

sql - 如何使用 Jsonb 从给定日期检索消息?

postgresql - 更改 Postgres 中 JSONB 列中值的类型

database - 让 PostgreSQL BDR 在没有 super 用户(postgres 用户)权限的情况下工作?