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

如何对存储过程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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 20:45:52