Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
postgresql未定义json字段未按预期返回null_Json_Postgresql - Fatal编程技术网

postgresql未定义json字段未按预期返回null

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->>

目标是返回JSON数据类型中缺少某个键的所有记录。为了说明这一点,我尝试在JSON结构中查询以下表数据中
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数据。与存储为文本的simple
JSON
type相比,它有几个优点,例如:支持索引。通常,您可能更喜欢使用
JSONB
而不是
JSON
。为了避免运算符错误,您应该将列强制转换为
JSONB
。类似于:
SELECT*fromtestwherenotdata::JSONB?“键3'