我有一个类型为jsonb
的列,在我的PostgreSQL 9.6.6数据库中将ID列表作为普通JSON数组,我想根据列表中的任何ID搜索此字段。如何查询写这个查询?
'[1,8,3,4,56,6]'
例如,我的表是:
CREATE TABLE mytable (
id bigint NOT NULL,
numbers jsonb
);
它有一些价值观:
id | numbers
-----+-------
1 | "[1,8,3,4,56,6]"
2 | "[1,2,7,4,24,5]"
我想要这样的事情:
SELECT *
FROM mytable
WHERE
id = 1
AND
numbers::json->>VALUE(56)
;
预期结果(仅当JSON数组具有56
作为元素时):
id | numbers
-----+-------
1 | "[1,8,3,4,56,6]"
第二步问题:
此命令的结果为TRUE
:
SELECT '[1,8,3,4,56,6]'::jsonb @> '56';
但是当我使用
时已经SELECT *
FROM mytable
numbers::jsonb @> '[56]';
或
SELECT *
FROM mytable
numbers::jsonb @> '56';
或
SELECT *
FROM mytable
numbers::jsonb @> '[56]'::jsonb;
结果一无所获:
id | numbers
-----+-------
(0 rows)
而不是这个:
id | numbers
-----+-------
1 | "[1,8,3,4,56,6]"
我发现为什么会得到(0 rows)
! :))
因为我用双引号将jsonb值插入mytable,实际上这是正确的值格式(没有双引号):
id | numbers
-----+-------
1 | [1,8,3,4,56,6]
2 | [1,2,7,4,24,5]
现在运行此命令时:
SELECT *
FROM mytable
numbers @> '56';
结果是:
id | numbers
-----+-------
1 | [1,8,3,4,56,6]
答案 0 :(得分:1)
使用jsonb
"包含" operator @>
:
SELECT *
FROM mytable
WHERE id = 1
AND numbers @> '[56]';
或
...
AND numbers @> '56';
在这种情况下,我们不使用数组括号。
dbfiddle here
如果您的表很大,这可以通过各种索引支持,以获得良好的读取性能。
详细说明/说明:
提示(寻址your comment):使用字符串文字进行测试时,请务必添加显式强制转换:
SELECT '[1,8,3,4,56,6]'::jsonb @> '56';
如果你不知道,Postgres不知道要采用哪种数据类型。有多种选择:
<击> 撞击>
SELECT '[1,8,3,4,56,6]' @> '56';
ERROR: operator is not unique: unknown @> unknown
相关: