You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:45:01