【问题标题】:Searching element in jsonb_array_elements(2D array)在 jsonb_array_elements(二维数组)中搜索元素
【发布时间】:2019-02-19 14:42:45
【问题描述】:

我有一个包含 2 列 R(id int,dat jsonb) 的表。 b 列 jsonb 由一个二维数组 [][] 组成。例如:

id| dat
1 | {"name":"a","numbers":[[1,2],[3,4],[5,6],[1,3]]}
2 | {"age":5,"numbers":[[1,1]]}
3 | {"numbers":[[5,6],[6,7]]}

我正在尝试在其中一个子数组中查找包含特定数字的所有 id。我使用了 2 个解决方案,我想了解为什么第一个不起作用:

1)

select * from R 
where exists (
    select from jsonb_array_elements(R.dat->'numbers')->>0 first,jsonb_array_elements(range.data->'numbers')->>1 second where first::decimal= 1 and second::decimal= 1
);
ERROR:  syntax error at or near "->>"
LINE 3: ...t from jsonb_array_elements(R.dat->'numbers')->>0 first,j...
SELECT *
FROM  R 
WHERE  EXISTS (
   SELECT FROM jsonb_array_elements(R.dat-> 'numbers') subarray
   WHERE (subarray->>0)::decimal = 1 and (subarray->>1)::decimal = 1
   );

另外,我看到 gin index 不处理这个操作符,所以基本上任何索引都可以帮助到这里吗?

【问题讨论】:

    标签: sql arrays json postgresql jsonb


    【解决方案1】:

    您的第一个查询引发错误,因为您只能在 FROM 子句中使用 table experssions(不是值表达式)。

    你可以让第二个查询更简单一些:

    select *
    from  r
    where exists (
        select from jsonb_array_elements(dat->'numbers') subarray
        where subarray = '[1,1]'
        );
    

    或在横向连接中使用该函数:

    select r.*
    from r
    cross join jsonb_array_elements(dat->'numbers')
    where value = '[1,1]';
    

    由于使用了jsonb_array_elements(),没有索引可以支持这些查询。

    您可能会想以这样的方式使用包含运算符@>

    select *
    from r
    where dat->'numbers' @> '[[1,1]]'::jsonb
    
     id |                            dat                             
    ----+------------------------------------------------------------
      1 | {"name": "a", "numbers": [[1, 2], [3, 4], [5, 6], [1, 3]]}
      2 | {"age": 5, "numbers": [[1, 1]]}
    (2 rows)
    

    不幸的是,正如您所见,它并没有像您预期的那样工作。在数组上使用运算符有点棘手,因为它的工作方式如下:array1 @> array2 为真,如果对于array2 的每个元素j,在array1 中有一个i,这样@987654334 @。因此,根据the documentation:

    在进行包含匹配时,数组元素的顺序并不重要,重复的数组元素只会被有效地考虑一次。

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2018-02-15
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多