Redshift 如何将CTE中存储的逗号分隔字符串作为IN查询可用列表
问题根源
当前CTE返回的是单条完整逗号分隔字符串,IN操作符要求子查询返回单列多行值,'tag1'无法与完整字符串'tag1, tag2, tag3'等值匹配,因此永远返回0。
可行解法
以下写法均保留你在查询顶部CTE集中定义变量的逻辑,后续维护时只需修改CTE内的字符串即可,无需改动下方匹配逻辑。
方案1:转数组后用ANY匹配(性能更优)
无需将数组拆为多行,直接对拆分后的数组做包含判断:
WITH tmp AS ( -- 拆分字符串时自动清理每个tag前后的空格,兼容分隔符后带任意数量空格的场景 SELECT array_agg(trim(tag)) AS tags FROM unnest(string_to_array('tag1, tag2, tag3', ',')) AS tag ) SELECT CASE WHEN 'tag1' = ANY(SELECT tags FROM tmp) THEN 1 ELSE 0 END AS matched_tags
方案2:拆成多行后用原生IN匹配(和你原有写法逻辑兼容)
更贴合你原本写IN子查询的使用习惯,可直接复用原有查询逻辑:
WITH tmp AS ( SELECT trim(unnest(string_to_array('tag1, tag2, tag3', ','))) AS tags ) SELECT CASE WHEN 'tag1' IN (SELECT tags FROM tmp) THEN 1 ELSE 0 END AS matched_tags
注意事项
- 必须加
trim()清理每个tag前后的空格,否则拆分后会出现' tag2'无法匹配'tag2'的问题 - 不推荐固定数量的
split_part逐个拆分写法,新增tag时需要手动调整拆分逻辑,维护成本远高于上述动态拆分的方案
内容的提问来源于stack exchange,提问作者Lilz
相关产品推荐
相关产品推荐

