Postgres中如何通过拼接分隔符精准查询Tags列的独立标签?
解决方案
针对你的需求,这里提供几种无需临时表、能精准匹配独立标签且排除指定标签的Postgres查询方法:
方法1:使用数组操作符(推荐,性能更优)
利用Postgres的string_to_array将逗号分隔的标签转为数组,再用数组包含操作符@>实现精准匹配,同时排除包含rhubarb_crumbs的行:
SELECT TicketId, Tags FROM [tablename] WHERE string_to_array(Tags, ',') @> ARRAY['rhubarb'] AND NOT (string_to_array(Tags, ',') @> ARRAY['rhubarb_crumbs'])
如果需要频繁进行这类标签查询,可以给数组创建GIN索引大幅提升性能:
CREATE INDEX idx_tags_array ON [tablename] USING GIN (string_to_array(Tags, ','));
方法2:修正LIKE匹配逻辑
如果你坚持使用前后加逗号的方式,需要同时添加排除rhubarb_crumbs的条件。若标签间存在未注意到的空格,可先用replace去除:
SELECT TicketId, Tags FROM [tablename] WHERE ',' || replace(Tags, ' ', '') || ',' LIKE '%,rhubarb,%' AND ',' || replace(Tags, ' ', '') || ',' NOT LIKE '%,rhubarb_crumbs,%'
注:如果你的标签间没有空格,可直接去掉replace(Tags, ' ', '')部分。
方法3:使用正则表达式匹配
通过正则精准匹配独立的rhubarb标签,同时排除rhubarb_crumbs:
SELECT TicketId, Tags FROM [tablename] WHERE Tags ~ '(^|,)rhubarb(,|$)' AND Tags !~ '(^|,)rhubarb_crumbs(,|$)'
正则中(^|,)表示标签位于开头或前面是逗号,(,|$)表示标签位于结尾或后面是逗号,确保匹配的是独立标签而非子串。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

