gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:25:04 25 4
gpt4 key购买 nike

我的 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”,我想返回所有具有该子字符串的元组。但我无法弄清楚如何编写相同的查询。

我关注了this related answer但不知道如何做 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 并获得与该文本匹配的结果。

最佳答案

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

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%';

db<> fiddle here

但这不是的正是:

I want to return all the tuples that have this substring.

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

您的原始问题在此之上有一个嵌套的 JSON 数组。您为此解决方案移除了外部阵列 - 我也这样做了。

根据您的实际需求new text search capability of Postgres 10可能会有用。

关于sql - jsonb LIKE 查询数组中的嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44711199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com