查询Postgres 9.3 JSON以检查数组是否包含字符串?
我的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
{"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
引用表。