CASE WHEN THEN子句中能否使用OR语句?Snowflake SQL交易数据过滤问题
关于THEN子句是否可以使用OR语句的解答
不可以。CASE表达式的THEN分支必须返回单个标量值,你写的('AMERICAN EAGLE' OR 'AMERICANEAGLE' OR 'AMERICAN-EAGLE')会被SQL解析为布尔逻辑判断,返回TRUE/FALSE而非匹配用的字符串,和CONCAT的参数类型要求冲突,因此会触发报错。
调整后可正常运行的SQL实现方案
方案1:拆分WHERE条件+正则匹配(Snowflake原生支持,写法最简洁)
直接将两类过滤逻辑拆分,针对COMPANY为AMERICAN的场景用正则匹配所有American Eagle的变体格式:
SELECT * FROM my_table WHERE -- 非AMERICAN公司保留所有匹配对应公司名的交易 (company != 'AMERICAN' AND transactions LIKE CONCAT('%', company, '%')) OR -- AMERICAN公司仅保留匹配American Eagle所有格式的交易 (company = 'AMERICAN' AND transactions RLIKE 'AMERICAN[ -]?EAGLE');
正则AMERICAN[ -]?EAGLE可同时覆盖中间带空格、无空格、带连字符的三种格式,后续如果有新的分隔符变体,只需在[]中添加对应字符即可。
方案2:多LIKE并列实现(无需掌握正则语法)
如果不想用正则,也可以直接把所有需要匹配的格式用LIKE并列:
SELECT * FROM my_table WHERE (company != 'AMERICAN' AND transactions LIKE CONCAT('%', company, '%')) OR (company = 'AMERICAN' AND ( transactions LIKE '%AMERICAN EAGLE%' OR transactions LIKE '%AMERICANEAGLE%' OR transactions LIKE '%AMERICAN-EAGLE%' ));
方案3:CASE WHEN写法(适配必须用CASE表达式的场景)
如果业务逻辑要求必须用CASE WHEN实现,可以调整CASE WHEN返回布尔值作为判断条件:
SELECT * FROM my_table WHERE CASE WHEN company != 'AMERICAN' THEN transactions LIKE CONCAT('%', company, '%') ELSE transactions RLIKE 'AMERICAN[ -]?EAGLE' END = TRUE;
内容的提问来源于stack exchange,提问作者Zhongyi Zhang
相关产品推荐
相关产品推荐

