【问题标题】:postgres - compare jsonb array, ignore order?postgres - 比较 jsonb 数组,忽略顺序?
【发布时间】:2022-01-25 16:53:20
【问题描述】:

如何在 postgresql (SELECT .. WHERE) 中精确匹配 jsonb 数组,同时忽略数组的顺序?

id data
1 ["a", "b"]
2 ["b"]
3 ["a"]
4 ["c", "a", "b"]

["b", "a"] 的输入我希望收到 id 1,["a", "b", "c"] 的输入我希望收到 id 4。我尝试使用 ?& 运算符,尽管它会返回 id 1、2 , 4 如果输入是["b"]

【问题讨论】:

标签: postgresql


【解决方案1】:

您应该尝试以这种方式使用包含运算符@>

SELECT * 
FROM your_table 
WHERE '["b", "a"]'::jsonb @> data 
  AND data @> '["b", "a", "c"]'::jsonb;

如果["b", "a"] 包含data 并且data 包含["b", "a"]["b", "a"] 等于data

【讨论】:

    【解决方案2】:

    让我们考虑一下这个架构和初始数据:

    CREATE TABLE test (
      id serial not null primary key,
      data jsonb
    );
    
    INSERT INTO test (data) VALUES 
      ('["a", "b"]'::jsonb),
      ('["b"]'::jsonb),
      ('["a"]'::jsonb),
      ('["c", "a", "b"]'::jsonb);
    

    查询如下:

    SELECT id, data FROM (
      SELECT *, 
      ARRAY(
        SELECT UNNEST(
          ARRAY(SELECT jsonb_array_elements_text(data))
        ) AS item ORDER BY item
      ) AS db_array_sorted, 
      ARRAY(
        SELECT UNNEST(
          ARRAY(SELECT jsonb_array_elements_text('["b", "a"]'::jsonb))
        ) AS item ORDER BY item
      ) AS input_array_sorted 
      FROM test
    ) AS sq
    WHERE db_array_sorted = input_array_sorted;
    

    执行结果:

    我相信,这个查询是非常自我描述的。 A DB fiddle.

    【讨论】:

      【解决方案3】:

      您可以在两个方向(“包含”和“包含在”)中使用包含运算符。仅当数组相等且独立于元素的顺序时,这才是正确的

      select *
      from the_table
      where data @> '["a","b"]' --<< data contains the array
        and data <@ '["a","b"]' --<< the array is contained in data
      
      select *
      from the_table
      where data @> '["a","b","c"]'
        and data <@ '["a","b","c"]'
      

      Online example

      【讨论】:

      • 不是重复答案吗?
      猜你喜欢
      • 2013-03-21
      • 2016-11-01
      • 1970-01-01
      • 2023-03-21
      • 2012-10-03
      • 2012-05-29
      • 2018-08-16
      • 2017-07-19
      • 2021-08-31
      相关资源
      最近更新 更多