[
{
"id": 1,
"columns": [
{
"id": 16,
"expression": "foo"
},
{
"id": 12,
"expression": "bar"
}
]
},
{
"id": 2,
"columns": [
{
"id": 11,
"expression": "baz"
},
{
"id": 8,
"expression": "foobar"
}
]
}
]
我有一个表,其中一列是 JSON 元素数组。在上方您可以看到此字段值的外观。
这个想法是根据expression
字段的值过滤表的行。例如,我可能只想保留包含expression
equals的列的行foo
。
我的第一个想法是json_array_elements()
多次使用,然后编写一个WHERE EXISTS(SELECT true FROM ...)
子句,但这会导致行重复。此外,我尝试将多个组合起来的尝试json_array_elements
并不总是按我期望的方式工作。
如果我能以某种方式展平所有项目以便expression
每一行都有一个大的值列表,它就会起作用。不幸的是,我不确定是否有一种方便的方法可以使用这种嵌套结构来做到这一点。
更新:修复了 JSON 对象
我的桌子看起来像这样:
id | description | | tables
1 | sample_description | <sample_above>
期望的结果是保留columns
此 json 数组的项目之间的字段中存在项目的行tables
,使得expression
值等于<some_value>
带有 json_array_elements 的 WHERE EXISTS 肯定会起作用,并且在正确完成时不会生成重复的行。但它也无法从 json 列上的 gin 索引中受益。最好以可行的方式来做,例如使用包含运算符。
它也适用于 ANY,尽管它相当冗长:
工作但次优的示例 WHERE EXISTS: