如何对存储过程CASE生成的STATE字段执行DISTINCT去重查询
问题背景
现有存储过程通过如下CASE逻辑计算STATE字段:
CASE WHEN ED.DESCRIPCION IS NOT NULL THEN ED.DESCRIPCION WHEN adjuntos > 0 THEN 'PRES' WHEN adjuntos=0 AND obligatory = 'N' THEN 'NO' ELSE 'PEN' END AS STATE
直接查询明细数据时,返回的STATE字段存在重复值,示例返回结果如下:
PRES NO PEN PEN PEN PEN
需要对计算得到的STATE结果去重,获取所有不重复的STATE值。
实现方案
可根据代码场景选择以下两种写法,二者返回结果完全一致:
- 写法1:直接在原查询上使用
DISTINCT关键字DISTINCT需要写在SELECT关键字之后,会对后面跟的所有字段组合去重,不要把DISTINCT写在CASE表达式内部,会触发语法错误。示例代码:
针对给出的示例重复结果,运行后将返回SELECT DISTINCT CASE WHEN ED.DESCRIPCION IS NOT NULL THEN ED.DESCRIPCION WHEN adjuntos > 0 THEN 'PRES' WHEN adjuntos = 0 AND obligatory = 'N' THEN 'NO' ELSE 'PEN' END AS STATE FROM 存储过程中使用的原表名 ED -- 此处保留存储过程中原有的JOIN关联、WHERE筛选条件即可PRES、NO、PEN三个去重后的值。 - 写法2:嵌套子查询后用
GROUP BY去重
如果不想修改原查询的明细计算逻辑,可以把原查询作为子查询,在外层对STATE字段分组去重:SELECT STATE FROM ( -- 此处粘贴存储过程中原有完整查询逻辑 SELECT CASE WHEN ED.DESCRIPCION IS NOT NULL THEN ED.DESCRIPCION WHEN adjuntos > 0 THEN 'PRES' WHEN adjuntos = 0 AND obligatory = 'N' THEN 'NO' ELSE 'PEN' END AS STATE FROM 存储过程中使用的原表名 ED -- 原有JOIN、WHERE条件保留在子查询内 ) AS t GROUP BY STATE
常见错误提醒:
DISTINCT是SELECT子句的全局关键字,不是可以修饰单个表达式的函数,类似SELECT CASE DISTINCT WHEN ...的写法不符合SQL语法规范,会直接执行报错。
内容的提问来源于stack exchange,提问作者Pablo Bongiolatti
相关产品推荐
相关产品推荐

