在jsonb数组

时间:2018-01-07 12:56:51

标签: sql arrays postgresql search jsonb

我有一个类型为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]

1 个答案:

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

相关: