WHERE子句中CASE WHEN用法疑问及UNION语句优化咨询
关于WHERE子句中CASE WHEN的使用及简化UNION查询的问题
问题描述
我搞不懂WHERE子句里CASE WHEN的正确用法,试着写了下面的查询:
SELECT * FROM Global_Sales WHERE sales_org IN ('AM NEW ZEALAND', 'AM AUSTRALIA', 'AM MEXICO') AND business_type IN (CASE WHEN sales_org IN ('AM MEXICO') THEN ('DIRECT SALES') ELSE ('DIRECT SALES','INDIRECT SALES','INTERNATIONAL') END)
想问下这种写法行不行?
后来知道这么写不行,我就用UNION写了长查询,但这种场景太多了,想缩短代码、少用UNION:
SELECT * FROM AM_SALE_GLOBAL WHERE sorg IN ('AM NEW ZEALAND') AND bus_type_cd In ('DIRECT SALES','INDIRECT SALES','INTERNATIONAL','OEM') UNION SELECT * FROM AM_SALE_GLOBAL WHERE sorg IN ('AM MEXICO') AND bus_type_cd In ('DIRECT SALES')
解决方案
你的CASE WHEN写法不可行
CASE表达式只能返回单个标量值,没办法返回多个值组成的集合,所以在IN子句里这么写会报错,不符合语法要求。不用UNION的简化写法
直接把不同销售组织对应的业务类型规则用逻辑条件组合到同一个WHERE子句里,代码更简洁易维护:
SELECT * FROM AM_SALE_GLOBAL WHERE (sorg IN ('AM NEW ZEALAND', 'AM AUSTRALIA') AND bus_type_cd IN ('DIRECT SALES','INDIRECT SALES','INTERNATIONAL','OEM')) OR (sorg = 'AM MEXICO' AND bus_type_cd = 'DIRECT SALES')
如果后续要加更多销售组织的规则,直接扩展OR条件就行,比重复写UNION子查询高效得多。
内容的提问来源于stack exchange,提问作者beeehop
相关产品推荐
相关产品推荐

