首页 > 解决方案 > 在 jsonb 中的数组内搜索值

问题描述

如果我有这样的 jsonb 对象:

{
  "eligibility": true,
  "dates_of_births": [
    [
      "2010-08-12",
      {
        "last_name": "abcd",
        "first_name": "efgh"
      }
    ],
    [
      "2009-08-12",
      {
        "last_name": "xyz",
        "first_name": "str"
      }
    ]
  ]
}

如何查询具有特定名字或出生日期的任何人?本质上,我如何在

谢谢您的帮助。我为糟糕的对象结构感到抱歉,但在我开始从事这个项目之前,它已经设置好了。

标签: jsonpostgresqljsonb

解决方案


您可以将表加入来自的集合jsonb_array_elements(jsdata->'dates_of_births'),然后通过使用@>运算符过滤出所需的名称或出生日期,该运算符查看左侧 JSON 值是否包含顶层的右侧 JSON 路径/值条目

并添加->>运算符以提取 SELECT 列表中的键或索引的相应值,例如:

SELECT j.value ->> 0 AS "DOB", 
      (j.value ->> 1)::jsonb ->> 'first_name' AS "First Name",
      (j.value ->> 1)::jsonb ->> 'last_name' AS "Last Name"
  FROM t
 CROSS JOIN jsonb_array_elements(jsdata->'dates_of_births') AS j 
 WHERE j @> '[{"first_name": "efgh"}]'::jsonb

或者

SELECT j.value ->> 0 AS "DOB", 
      (j.value ->> 1)::jsonb ->> 'first_name' AS "First Name",
      (j.value ->> 1)::jsonb ->> 'last_name' AS "Last Name"
  FROM t
 CROSS JOIN jsonb_array_elements(jsdata->'dates_of_births') AS j 
 WHERE j @> '["2009-08-12"]'::jsonb

Demo


推荐阅读