【问题标题】:How do I query a postgresql JSON column that is an array如何查询作为数组的 postgresql JSON 列
【发布时间】:2021-10-17 07:55:51
【问题描述】:

我有一个包含 JSON 列(命名集合)的表(命名成员)。 JSON 列存储一个整数数组。

例子:

collection
----------
[1]
[5,4,0]
[9,3,1]

如何查询该数组中是否有整数?

示例:选择集合中包含 3 的所有成员(可以是 [1] 或 [1,2,3,4,etc])。

有可能吗?

【问题讨论】:

标签: json postgresql querying


【解决方案1】:

您可以使用json / jsonb containment operator @>
由于您的 JSON 数组似乎只包含 数字,因此简单的语法有效:

SELECT *
FROM   tbl
WHERE  collection @> '3';  -- single quotes required!

如果您省略引号,Postgres 会将 数字文字 解析为 integer 并且找不到 json @> integer 的运算符。
使用引号,字符串字面量分别解析为从上下文派生的json/jsonb(包含JSON原始类型number),并且可以正常工作。 p>

这同样有效,并且可能更可取:

SELECT *
FROM   tbl
WHERE  collection @> '[3]';

现在,正确的操作数解析为包含 JSON 原始类型 arrayjson / jsonb - 包含单个 数字
这也适用于 objects 作为数组元素类型,如果没有数组包装器,它将无法工作。

为了使这个快速,使用类型jsonb 而不是json,因为它享有索引支持。使用默认操作符类jsonb_ops(默认不必拼写):

CREATE INDEX tbl_jsb_idx ON tbl USING GIN (collection);

或者使用更专业(但也更高效)的运算符类jsonb_path_ops(必须说明非默认值):

CREATE INDEX tbl_jsb_idx ON tbl USING GIN (collection jsonb_path_ops);

见:

【讨论】:

    【解决方案2】:

    使用json运算符@>,意思是“包含”:

    select 
      collection @> 3 as has_3 
    

    如果您的列是 json 文本,请使用 collection::json @> 3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多