提问人:WSC 提问时间:8/8/2018 更新时间:8/8/2018 访问量:4546
将 CASE WHEN 与 NVL() 和 GROUP BY 相结合
Combing CASE WHEN with NVL() and GROUP BY
问:
我在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
我最终得到的是两行“无”;实质上,这两个“无”值是分开处理的。
如何组合它们?
答:
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 BY
Val
Val
X
Val IS NULL
CASE
你可以通过分组来解决这个问题,而不是:CASE
Val
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
我更喜欢第二种方式,因为它更具可读性。
评论
case
nvl