Postgres WHERE数组包含空字符串

时间:2017-01-17 17:39:47

标签: sql arrays json postgresql

我正在尝试select * from demo where demojson->'sub'->'item' = array(""),但这不起作用。我想找到以下

  • JSON列中.sub.item的所有行都是一个只包含一个空字符串的数组([""]
  • JSON列中.sub.item的所有行都是一个可能包含多个项目的数组,但至少有一个项目是空字符串。 (["not empty", "also not empty", ""]

demojson列可以包含例如

{ 
  "key": "value",
  "sub": {
    "item": [""]
  }
}

3 个答案:

答案 0 :(得分:1)

你试过吗

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第一个数组元素作为文本。

答案 1 :(得分:1)

由于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":[""]}} |
+----+------------------------------------+

可在此处查看:http://rextester.com/VEPY57423

答案 2 :(得分:1)

尝试以下方法:

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