【问题标题】:Values of JSON exist in columns' JSONB arrayJSON 的值存在于列的 JSONB 数组中
【发布时间】:2018-12-12 21:45:35
【问题描述】:

我有一个棘手的查询,它试图找到将 JSON 数组列表与列中 JSON 值列表进行比较的匹配项

带有“关键字”列的“事物”表将包含以下内容:

'["car", "house", "boat"]'::JSONB

查询将包含以下值:

'["car", "house"]'::JSONB

我想查找列表中同时包含“汽车”和“房屋”的所有行。这是我(大部分)微弱的尝试:

SELECT
  *
FROM
  "Things"
WHERE
 "Keywords"::JSONB ?| ARRAY(
     SELECT * FROM JSONB_ARRAY_ELEMENTS('["house","car"]'::JSONB)
  )::TEXT[]

此外,在索引方面,我假设添加 GIST 索引将是我的最佳选择。

【问题讨论】:

    标签: json postgresql jsonb


    【解决方案1】:

    我想找到同时包含“car”和“house”的所有行

    所以正确的运算符是?& - Do all of these array strings exist as top-level keys?

    您的查询几乎是正确的,更改运算符并使用jsonb_array_elements_text()

    WITH "Things"("Keywords") AS (
    VALUES
        ('["car", "house", "boat"]'::jsonb),
        ('["car", "boat"]'),
        ('["car", "house"]'),
        ('["house", "boat"]')
    )
    
    SELECT
      *
    FROM
      "Things"
    WHERE
     "Keywords" ?& array(
         SELECT jsonb_array_elements_text('["house","car"]')
      )
    
             Keywords         
    --------------------------
     ["car", "house", "boat"]
     ["car", "house"]
    (2 rows)
    

    如果参数可以写成常规的文本数组,查询会更简单:

    SELECT
      *
    FROM
      "Things"
    WHERE
     "Keywords" ?& array['house', 'car']
    

    在这两种情况下,您都可以使用GIN index:

    jsonb 的默认 GIN 运算符类支持使用顶级键存在运算符 ?、?& 和 ?| 的查询运算符(...)

    【讨论】:

      猜你喜欢
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 2020-04-05
      相关资源
      最近更新 更多