postgresql未定义json字段未按预期返回null
目标是返回JSON数据类型中缺少某个键的所有记录。为了说明这一点,我尝试在JSON结构中查询以下表数据中postgresql未定义json字段未按预期返回null,json,postgresql,Json,Postgresql,目标是返回JSON数据类型中缺少某个键的所有记录。为了说明这一点,我尝试在JSON结构中查询以下表数据中faultyField返回null的任何内容: id::SERIAL | data::JSON ------------+------------------- 1 | {"key" : "val"} 2 | {"key1" : "val2"} 下列两种说法之一: SELECT * FROM test WHERE data->>
faultyField
返回null
的任何内容:
id::SERIAL | data::JSON
------------+-------------------
1 | {"key" : "val"}
2 | {"key1" : "val2"}
下列两种说法之一:
SELECT * FROM test WHERE data->>'faultyField' = null;
SELECT * FROM test WHERE (data->>'faultyField')::text = 'null';
是否应该返回所有值(根据我在工作中发现的两个SO帖子)?但出于某种原因,它没有。这两个函数只返回空结果
我不是PostgreSQL的向导,所以我尝试了下面这些语句之间的一切,只是想看看它们是否有效。遗憾的是,他们没有
SELECT * FROM test WHERE (SELECT json_object_keys(data) FROM test)='key';
SELECT * FROM test WHERE 'key' in json_object_keys(data);
SELECT * FROM test WHERE 'key' := json_object_keys(data);
SELECT * FROM test WHERE 'key' ANY (json_object_keys(data));
有没有方法返回JSON字符串中缺少键的记录?不要将
=
与null
一起使用。尝试:
select *
from test
where data->>'faultyField' is null;
发件人:
不要写入表达式=NULL,因为NULL不是“等于”NULL。(空值表示未知值,不知道两个未知值是否相等。)
编辑
我强烈建议您使用JSONB
而不是JSON
。它是一种更强大的类型,允许建立索引,并具有我在下面演示的其他操作符。
如果要测试jsonb顶级字段中是否不存在密钥,请使用
?
运算符:
CREATE TEMP TABLE test AS VALUES
(1, '{"key" : "val"}'::JSONB),
(2, '{"key2" : "val2"}'::JSONB);
SELECT * FROM test WHERE NOT column2 ? 'key3';
使用
data->“faultyField”
将尝试获取该键的值,而不是测试该键是否存在。这不是您要查找的内容,因为它将返回行,即使faultyField
键存在并且具有空值。我猜op是在检查键是否存在,而不是测试其值。在这种情况下,data->“faultyField”为空
将返回行,即使faultyField
键存在且具有空值。但我可能错了,你错了<代码>数据->>“faultyField”为空为真当且仅当缺少密钥时。是否确定<代码>创建临时表测试,选择1作为id,'{“key”:null}'::JSONB作为数据;从测试中选择*数据->>“键”为空代码>。这个测试用例按照我的预期返回行。根据9.5.6进行测试。没有问题。谢谢。据我所知,它可以完美地工作:)没有运算符与给定的名称和参数类型匹配。您可能需要添加显式类型强制转换。
上的?
-这是为什么??
操作符自9.4起就存在于JSONB
类型中。你的PostgreSQL版本是什么?关于的更多信息。我目前正在运行v9.6.1。JSONB用于字节数据,其编号JSONB
以分解的二进制格式存储json数据。与存储为文本的simpleJSON
type相比,它有几个优点,例如:支持索引。通常,您可能更喜欢使用JSONB
而不是JSON
。为了避免运算符错误,您应该将列强制转换为JSONB
。类似于:SELECT*fromtestwherenotdata::JSONB?“键3'代码>