我在SELECT中执行CASE WHEN
,将所有null转换为'None'
。我还想获取一个特定的非null值(例如'X'
),并将其与null值相同(例如将它们全部设置为'None'
)。
我做这样的事情:
SELECT
CASE WHEN Val = 'X' THEN 'None' ELSE NVL(Val, 'None') END ValCol
FROM tbl
GROUP BY Val
我最终得到的是两行“无”;本质上,两个“无”值是分开处理的。
如何合并它们?
答案 0 :(得分:5)
问题是GROUP BY
。您正在按Val
分组,因此Val
为X
的所有行都被分组在一起,而Val IS NULL
的所有行都被分组在一起。实际上,这将导致2行,但是由于您的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
答案 1 :(得分:2)
尝试一下:
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)
答案 2 :(得分:0)
您可以通过使用表达式而不是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
我更喜欢第二种方式,因为它更具可读性。