用NVL()和GROUP BY组合CASE WHEN

时间:2018-08-08 08:07:54

标签: sql oracle oracle-sqldeveloper

我在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

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

如何合并它们?

3 个答案:

答案 0 :(得分:5)

问题是GROUP BY。您正在按Val分组,因此ValX的所有行都被分组在一起,而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

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