JSON列中的一行如下所示:
{"general": {
"somekey": "somevalue",
"tags": ["first_tag", "second_tag", "third_tag"]}}
我需要返回包含特定标记(例如“first_tag”)的标记列表行。在PostgreSQL 9.3中有这样做的方法吗?
最佳答案
假设表名为t
,列名为x
:
SELECT *
FROM t
WHERE exists(
SELECT 1
FROM json_array_elements(x#>'{general,tags}')
WHERE array_to_json(array[value])->>0='first_tag'
);
它不使用
jsonb
或其他较新的东西,因此应该在9.3上工作。另请参见sqlfiddle。其思想是使用
json_array_elements
函数,该函数将json数组转换为sql表。该表有一个名为value
的列,类型为json
。在本例中,我们在子查询中使用
json_array_elements
遍历所有标记的列表。一个复杂的问题是value
(这里表示一个标记)是json
类型,因此我们必须将其转换为文本。不幸的是,postgresql
没有直接执行此操作的函数,因此我们必须将其转换为单个元素数组,然后将该单个元素提取为文本。然后我们可以将该文本与要查找的标记进行比较(在上面的示例中为first_tag
)。此列的结果不重要,我们只关心它是否为空。关于json - 查询Postgres 9.3 JSON以检查数组是否包含字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39391008/