用NVL()和GROUP BY组合CASE WHEN

WSC*_*WSC 2 sql oracle oracle-sqldeveloper

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

我做这样的事情:

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

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

如何合并它们?

EzL*_*zLo 5

问题是GROUP BY。您按进行分组Val,因此所有带有Valas的行都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
Run Code Online (Sandbox Code Playgroud)

作为旁注,我发现以下CASE内容更具表现力:

CASE WHEN Val = 'X' OR Val IS NULL THEN 'None' ELSE Val END
Run Code Online (Sandbox Code Playgroud)