在 postgresql 中的 JSON 列上搜索查询


Search query on JSON column in postgresql

我的表"类别"中有一列"标签",这是一个json类型

----------------------------------------------------------------
id    name                tags
----------------------------------------------------------------
1     Electronics         ["phones","computers","watches"]
2     Fashion             ["jewelry","costumes","watches"]
3     Food                ["cakes","sweets","juices"]
4     Tools               ["keyboards","pens","drills"]
----------------------------------------------------------------

我想获取在SQL中匹配的数组中具有任何一个标签的所有类别

select * from categories where tags::jsonb ?| '{"watches","sweets"}'

我希望结果集为

------------------------------
1     Electronics 
2     Fashion
3     Food  
------------------------------

所以前两个类别与"手表"匹配,第三个类别与"糖果"匹配

上面的查询在我的本地服务器上完美运行,因为它在 9.4 上但是当我搬到现场时,它是 9.2.15 并且没有 jsonb,返回错误,是否有类似的 JSON 类型运算符返回查询中的任何一个匹配元素?

categories.tags JSON 还是文本数据类型?在 PostgreSQL 9.2 中,JSON 数据类型支持非常有限,因此尽管您可以在其中存储 JSON 数据,但除了转换为文本之外,您很难以任何其他方式处理它。

您可以使用数组重叠&&,而不是 jsonb ?|运算符:

with
  categories(id,name,tags) as (
    values (1, 'Electronics', '["phones","computers","watches"]'::json),
           (2, 'Fashion', '["jewelry","costumes","watches"]'),
           (3, 'Food', '["cakes","sweets","juices"]'),
           (4, 'Tools', '["keyboards","pens","drills"]'))
select *
from categories
where regexp_replace(regexp_replace(tags::text, '^'[', '{'), '']$', '}')::text[] && '{watches,sweets}'::text[]

我刚刚找到了这个问题的简单解决方案

我首先将 json 类型转换为文本然后将我的搜索表达式替换为SIMILAR TO

下面是示例 SQL

select * from categories where tags SIMILAR TO  ("watches"|"sweets")

"是必须的,因为它们有助于获取适当的匹配项,例如当您有像 watches 这样的标签时,watches-new使用 SIMILAR to with with out " like (watches|sweets) 将导致两者,如果您在存储在文本列上的 JSON 上使用 ",它就像您想要的那样工作。

希望这对像我这样的人有所帮助。