Teradata中CASE表达式WHEN子句非法表达式错误的解决方法
Teradata CASE表达式报错解决:Illegal Expression In WHEN of CASE Expression
错误原因
Teradata对CASE表达式的WHEN条件有语法限制,不支持在该位置使用非关联的IN子查询,这就是触发报错的核心原因。
修改方案
方案1:用EXISTS替换IN(关联子查询)
把原有的非关联IN子查询改成关联的EXISTS判断,Teradata支持这种写法:
SELECT CASE WHEN Country='UK' AND EXISTS ( SELECT 1 FROM table t2 WHERE t2.Customer = t1.Customer AND t2.Customer <> 'A' ) THEN 'EUR' ELSE 'OTHER' END AS Continent_E FROM table t1
给表加别名t1和t2让子查询与主表关联,既符合Teradata语法要求,逻辑也和原语句完全一致。
方案2:提前筛选有效客户(CTE/关联方式)
先把符合条件的客户(不等于'A'的distinct值)单独提取出来,再和原表关联,避免在CASE里嵌套子查询:
WITH valid_customers AS ( SELECT DISTINCT Customer FROM table WHERE Customer <> 'A' ) SELECT CASE WHEN t.Country='UK' AND t.Customer IN (SELECT Customer FROM valid_customers) THEN 'EUR' ELSE 'OTHER' END AS Continent_E FROM table t
或者用JOIN的方式,大数据集场景下性能更优:
SELECT CASE WHEN t.Country='UK' AND vc.Customer IS NOT NULL THEN 'EUR' ELSE 'OTHER' END AS Continent_E FROM table t LEFT JOIN (SELECT DISTINCT Customer FROM table WHERE Customer <> 'A') vc ON t.Customer = vc.Customer
补充说明
两种方案都能实现原需求:小数据集用方案1的EXISTS写法更简洁;大数据集优先选方案2的JOIN/CTE方式,执行效率更高。
内容的提问来源于stack exchange,提问作者Arthur_75
相关产品推荐
相关产品推荐

