将 CASE WHEN 与 NVL() 和 GROUP BY 相结合

Combing CASE WHEN with NVL() and GROUP BY

提问人:WSC 提问时间:8/8/2018 更新时间:8/8/2018 访问量:4546

问:

我在SELECT中执行一个将任何null转换为.我还想取一个特定的非 null 值(例如 )并将其视为与 null 值相同的值(例如,使它们全部)。CASE WHEN'None''X''None'

我做这样的事情:

SELECT
CASE WHEN Val = 'X' THEN 'None' ELSE NVL(Val, 'None') END ValCol
FROM tbl
GROUP BY Val

我最终得到的是两行“无”;实质上,这两个“无”值是分开处理的。

如何组合它们?

SQL Oracle-SQLD开发商

评论

1赞 jarlh 8/8/2018
为什么不简单地选择DISTINCT呢?
0赞 William Robertson 8/8/2018
顺便说一句,在聚合任何表达式时,此问题将适用,而不仅仅是 和 。casenvl

答:

2赞 akshay 8/8/2018 #1

试试这个:

SELECT
CASE WHEN Val = 'X' THEN 'None' ELSE NVL(Val, 'None') END ValCol
FROM tbl
GROUP BY (CASE WHEN Val = 'X' THEN 'None' ELSE NVL(Val, 'None') END)

评论

0赞 WSC 8/8/2018
谢谢你。EzLo也有同样的想法。我把他标记为正确答案,因为它提供了更多细节。
7赞 EzLo 8/8/2018 #2

问题是.您是按 分组的,因此所有带有 as 的行都分组在一起,而所有 where 的行都分组在一起。这实际上会产生 2 行,但由于您的表达式,它们以相同的值显示。GROUP BYValValXVal IS NULLCASE

你可以通过分组来解决这个问题,而不是:CASEVal

SELECT
    CASE WHEN Val = 'X' THEN 'None' ELSE NVL(Val, 'None') END ValCol
FROM 
    tbl
GROUP BY 
    CASE WHEN Val = 'X' THEN 'None' ELSE NVL(Val, 'None') END

顺便说一句,我发现以下内容更具表现力:CASE

CASE WHEN Val = 'X' OR Val IS NULL THEN 'None' ELSE Val END

评论

0赞 WSC 8/8/2018
明。现在你提到它,我以前实际上见过这个。
1赞 DirkNM 8/8/2018 #3

为此,可以使用表达式而不是 GROUP BY 子句中的列,如下所示:

SELECT CASE WHEN Val = 'X' THEN 'None' ELSE NVL(Val, 'None') END ValCol
  FROM tbl
 GROUP 
    BY CASE WHEN Val = 'X' THEN 'None' ELSE NVL(Val, 'None') END

第二种方法是对 CASE 使用子选择,并在外部选择中分组

SELECT ValCol
  FROM(SELECT CASE WHEN Val = 'X' THEN 'None' ELSE NVL(Val, 'None') END ValCol
         FROM tbl
      )
 GROUP
    BY ValCOL

我更喜欢第二种方式,因为它更具可读性。