我的表"类别"中有一列"标签",这是一个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 上使用 ",它就像您想要的那样工作。
希望这对像我这样的人有所帮助。