假设我们有一个items包含列name和的表attributes:
CREATE TABLE students (
name VARCHAR(100),
attributes JSON
)
Run Code Online (Sandbox Code Playgroud)
其中属性是一组(总是结构相同的)JSON 文档,例如
[{"name":"Attribute 1","value":"Value 1"},{"name":"Attribute 2","value":"Value 2"}]
Run Code Online (Sandbox Code Playgroud)
我现在想找到任何属性值与某些内容(例如Foo%)匹配的所有学生。这是一个游乐场示例。
我意识到这并不是最直接的设计,但就目前而言,这是我必须使用的设计,尽管这种搜索的性能绝对是非常低效的,这当然是一个值得关注的问题。
Kau*_*yak 11
您可以使用json_array_elements访问元素,然后使用 ->> json 运算符使用某些值进行搜索。
select s.*,j from
students s
cross join lateral json_array_elements ( attributes ) as j
WHERE j->>'value' like 'Foo%'
Run Code Online (Sandbox Code Playgroud)
编辑
现在的问题是交叉连接将“复制”行。有没有更好的方法来避免这种情况
用于WITH ORDINALITY为每个元素生成 id,然后用于DISTINCT ON获取每个学生的第一个/最后一个匹配项。
select DISTINCT ON (name) s.*,j.attr from
students s
cross join lateral json_array_elements ( attributes ) WITH ORDINALITY as j(attr,id)
WHERE j.attr->>'value' like 'Value%'
ORDER BY name,j.id
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9386 次 |
| 最近记录: |