小编典典

对数组中嵌套对象的jsonb LIKE查询

sql

我的JSON数据如下所示:

[{
  "id": 1,
  "payload": {
    "location": "NY",
    "details": [{
            "name": "cafe",
            "cuisine": "mexican"
        },
        {
            "name": "foody",
            "cuisine": "italian"
        }
    ]
  }
}, {
  "id": 2,
  "payload": {
    "location": "NY",
    "details": [{
            "name": "mbar",
            "cuisine": "mexican"
        },
        {
            "name": "fdy",
            "cuisine": "italian"
        }
    ]
  }
}]

给定文本“ foo”,我想返回所有具有此子字符串的元组。但是我不知道如何编写相同的查询。

我遵循了这个相关的答案,但不知道该怎么做LIKE
这是我现在正在工作的内容:

SELECT r.res->>'name' AS feature_name, d.details::text
  FROM   restaurants r
    , LATERAL (SELECT ARRAY (
     SELECT * FROM json_populate_recordset(null::foo, r.res#>'{payload, 
       details}')
     )
   ) AS d(details)
 WHERE d.details @> '{cafe}';

cafe我不想传递整个文本,而是传递ca并获得与该文本匹配的结果。


阅读 181

收藏
2021-04-28

共1个答案

小编典典

您的解决方案可以进一步简化:

SELECT r.res->>'name' AS feature_name, d.name AS detail_name
FROM   restaurants r
     , jsonb_populate_recordset(null::foo, r.res #> '{payload, details}') d
WHERE  d.name LIKE '%oh%';

或更简单一点,jsonb_array_elements()因为foo在此示例中,您实际上根本不需要行类型():

SELECT r.res->>'name' AS feature_name, d->>'name' AS detail_name
FROM   restaurants r
     , jsonb_array_elements(r.res #> '{payload, details}') d
WHERE  d->>'name' LIKE '%oh%';

dbfiddle
在这里

但这 不是 您确切 要求的

我想返回所有具有该子字符串的元组。

您将返回所有JSON数组元素(每个基表行0-n),其中一个特定键('{payload,details,*,name}')匹配(区分大小写)。

您最初的问题是在此之上有一个嵌套的JSON数组。您删除了此解决方案的外部阵列-我做了同样的事情。

根据您的实际要求,Postgres
10
新文本搜索功能可能会有用。

2021-04-28