jsonb LIKE 查询数组中的嵌套对象
jsonb LIKE query on nested objects in an array
我的 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" 我想要 return 所有具有该子字符串的元组。但我无法弄清楚如何编写相同的查询。
我关注了 但不知道该怎么做 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.details::text
FROM restaurants r
, LATERAL (
SELECT * FROM json_populate_recordset(null::foo, r.res#>'{payload, details}')
) AS d(details)
WHERE d.details LIKE '%oh%';
Fiddle 这里 - http://sqlfiddle.com/#!15/f2027/5
您的解决方案可以进一步简化:
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 here
但这不是你问的:
I want to return all the tuples that have this substring.
您将返回所有 JSON 数组元素(每个基 table 行 0-n 个),其中一个特定键 ('{payload,details,*,name}'
) 匹配(区分大小写)。
并且您的原始问题在此之上有一个嵌套的 JSON 数组。您为此解决方案删除了外部阵列 - 我也这样做了。
根据您的实际要求,new text search capability of Postgres 10 可能会有用。
我的 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" 我想要 return 所有具有该子字符串的元组。但我无法弄清楚如何编写相同的查询。
我关注了 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.details::text
FROM restaurants r
, LATERAL (
SELECT * FROM json_populate_recordset(null::foo, r.res#>'{payload, details}')
) AS d(details)
WHERE d.details LIKE '%oh%';
Fiddle 这里 - http://sqlfiddle.com/#!15/f2027/5
您的解决方案可以进一步简化:
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 here
但这不是你问的:
I want to return all the tuples that have this substring.
您将返回所有 JSON 数组元素(每个基 table 行 0-n 个),其中一个特定键 ('{payload,details,*,name}'
) 匹配(区分大小写)。
并且您的原始问题在此之上有一个嵌套的 JSON 数组。您为此解决方案删除了外部阵列 - 我也这样做了。
根据您的实际要求,new text search capability of Postgres 10 可能会有用。