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/

10-12 00:37
查看更多