Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查询Postgres 9.3 JSON以检查数组是否包含字符串?_Json_Postgresql_Postgresql 9.3 - Fatal编程技术网

查询Postgres 9.3 JSON以检查数组是否包含字符串?

查询Postgres 9.3 JSON以检查数组是否包含字符串?,json,postgresql,postgresql-9.3,Json,Postgresql,Postgresql 9.3,我的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_ar

我的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上工作。另见

其思想是使用
json\u array\u elements
函数,将json数组转换为sql表。该表有一个名为
value
的列,类型为
json

在本例中,我们在子查询中使用
json\u array\u elements
遍历所有标记的列表。一个复杂的问题是
value
(这里代表一个标记)的类型是
json
,因此我们必须将其转换为文本。不幸的是,
postgresql
没有直接执行此操作的函数,因此我们必须将其转换为单个元素数组,然后将单个元素提取为文本。然后我们可以将该文本与我们要查找的标记进行比较(
first\u tag
,在上面的示例中)。此列的结果并不重要,我们只关心它是否为空。

您可以使用:

CREATE OR REPLACE FUNCTION fn_json_array_contains(a_json json, a_e anyelement)
RETURNS BOOLEAN AS $BODY$
BEGIN
    RETURN to_json(a_e)::TEXT IN (SELECT value::TEXT FROM json_array_elements(a_json) e);
END;
$BODY$ LANGUAGE plpgsql IMMUTABLE
;

SELECT * FROM t WHERE fn_json_array_contains(x#>'{general,tags}', 'first_tag');

当我从您的示例中运行内部查询时,我从所有记录中获得标记列表。但是,当我运行完整查询时,我得到了0行。@BanzaiTokyo我调整了字符串测试,它现在应该可以工作了。我不知道它是如何工作的,但它确实工作了!!非常感谢你!如果您能分享一个链接,我将不胜感激,在这里我可以阅读更多关于在Postgres 9.3中查询json的内容,特别是关于“包含”之类的术语。因为这个解释不多。@BanzaiTokyo我没有更多的参考资料给你,我把它扩展了一点,我的答案。希望对你有所帮助。我更新了答案,提供了更多信息。内部查询通过列
x
引用表。