Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
Sql 数组包含空字符串的Postgres_Sql_Arrays_Json_Postgresql - Fatal编程技术网

Sql 数组包含空字符串的Postgres

Sql 数组包含空字符串的Postgres,sql,arrays,json,postgresql,Sql,Arrays,Json,Postgresql,我试图从demojson->'sub'->'item'=array(“”)的演示中执行select*,但这不起作用。我想找到以下信息 JSON列中.sub.item是一个数组的所有行,其中正好包含一个空字符串([“”]) JSON列中.sub.item所在的所有行都是一个数组,该数组可能包含多个项,但至少有一个项是空字符串。([“不为空”、“也不为空”、“不为空”]) 例如,demojson列可以包含 { "key": "value", "sub": { "item": [

我试图从demojson->'sub'->'item'=array(“”)的演示中执行
select*,但这不起作用。我想找到以下信息

  • JSON列中
    .sub.item
    是一个数组的所有行,其中正好包含一个空字符串(
    [“”]
  • JSON列中
    .sub.item
    所在的所有行都是一个数组,该数组可能包含多个项,但至少有一个项是空字符串。(
    [“不为空”、“也不为空”、“不为空”]
例如,demojson列可以包含

{ 
  "key": "value",
  "sub": {
    "item": [""]
  }
}
你试过了吗

SELECT * from demo 
WHERE demojson->'sub'->>'item' = '[""]';
这里
->
操作符允许以文本形式获取JSON对象字段

还有另一个解决方案

SELECT * from demo 
WHERE json_array_length(demojson->'sub'->'item') = 1 AND 
      demojson->'sub'->'item'->>0 = '';
这里
->
运算符允许获取JSON第一个数组元素作为文本。

您尝试过吗

SELECT * from demo 
WHERE demojson->'sub'->>'item' = '[""]';
这里
->
操作符允许以文本形式获取JSON对象字段

还有另一个解决方案

SELECT * from demo 
WHERE json_array_length(demojson->'sub'->'item') = 1 AND 
      demojson->'sub'->'item'->>0 = '';

这里
->
操作符允许获取JSON第一个数组元素作为文本。

由于JSONLint没有验证提供的文本示例,我使用了下一个:

CREATE TABLE info (id int, j JSON);
insert into info values 
  (1, '{"key":"k1", "sub": {"item":["i1","i2"]}}'),
  (2, '{"key":"k2", "sub": {"item":[""]}}'),
  (3, '{"key":"k3", "sub": {"item":["i2","i3"]}}');
以这种方式使用where子句,它可以:

select * from info
where j->'sub'->>'item' = '[""]';


+----+------------------------------------+
| id |                  j                 |
+----+------------------------------------+
|  2 | {"key":"k2", "sub": {"item":[""]}} |
+----+------------------------------------+

可以在此处查看:

由于JSONLint无法验证提供的文本示例,我使用了下一个:

CREATE TABLE info (id int, j JSON);
insert into info values 
  (1, '{"key":"k1", "sub": {"item":["i1","i2"]}}'),
  (2, '{"key":"k2", "sub": {"item":[""]}}'),
  (3, '{"key":"k3", "sub": {"item":["i2","i3"]}}');
以这种方式使用where子句,它可以:

select * from info
where j->'sub'->>'item' = '[""]';


+----+------------------------------------+
| id |                  j                 |
+----+------------------------------------+
|  2 | {"key":"k2", "sub": {"item":[""]}} |
+----+------------------------------------+
可以在此处查看:

尝试以下操作:

SELECT * FROM demo
WHERE demojson->'sub'->'item' = to_jsonb(ARRAY['']);
请尝试以下操作:

SELECT * FROM demo
WHERE demojson->'sub'->'item' = to_jsonb(ARRAY['']);

请显示JSON文件或最小示例。添加了一个示例。我无法验证此文本是否为有效的JSON文件。请显示JSON文件或最小示例。添加了一个示例。我无法验证此文本是否为有效的JSON文件。由于您在模式中没有使用任何通配符,您可能只需要
='[''”
='
,而不是
像“[''”
像“”
@IMSoP谢谢您的建议,这很有意义。因为您在模式中没有使用任何通配符,您可能只需要
='['']“
=”
而不是像“[”“]”那样的
谢谢你的建议,这很有意义。