在 Oracle SQL 中通过 CASE 语句映射 NULL 值

问题描述 投票:0回答:2

我正在尝试使用 CASE 语句映射几个值。一切似乎都工作正常,除非 ID 列中有 NULL 值。它显示来自 else 的“其他状态”,而不是来自 WHEN NULL 的“无状态”。

SELECT ID,CASE ID
WHEN 'TR' THEN 'TRIPURA'
WHEN 'MN' THEN 'MANIPUR'
WHEN 'AS' THEN 'ASSAM'
WHEN 'NL' THEN 'NAGALAND'
WHEN 'AN' THEN 'ARUNACHAL'
WHEN NULL THEN 'NO STATE'
ELSE 'OTHER STATE'
END AS STATE
FROM GEOGRAPHY;

NULL 可以与 DECODE 一起使用,但不能与 CASE 一起使用。可以使用 CASE 语句比较 NULL 值吗?不要引用 NVL,NULL IF。我只想用 CASE 来实现。

我试图查看列表中是否存在 NULL 值,它应该返回“NO STATE”。

sql oracle case oracle-sqldeveloper conditional-operator
2个回答
0
投票

CASE
检查您的列的值是否等于您提供的值。
NULL
没有值,它不能等于任何东西,所以你不能那样做。 如果你迫切想只使用
CASE
并且避免使用
COALESCE
NVL
,你可以检查之前的 id
IS NULL
,如下所示:

SELECT ID,
  CASE WHEN ID IS NULL THEN 'NO STATE'
  ELSE CASE ID
  WHEN 'TR' THEN 'TRIPURA'
  WHEN 'MN' THEN 'MANIPUR'
  WHEN 'AS' THEN 'ASSAM'
  WHEN 'NL' THEN 'NAGALAND'
  WHEN 'AN' THEN 'ARUNACHAL'
  ELSE 'OTHER STATE'
END END AS STATE
FROM GEOGRAPHY;

看到这个db<>小提琴


0
投票

有多种选择;这是其中的一些。

样本数据:

SQL> with geography (id) as
  2    (select 'TR' from dual union all
  3     select 'TX' from dual union all
  4     select null from dual
  5    )

多种选择:

  6  select id,
  7    -- your CASE expression
  8    case id when 'TR' then 'TRIPURA'
  9            when 'MN' then 'MANIPUR'
 10            when null then 'NO STATE'
 11            else 'OTHER STATE'
 12    end as state,
 13    -- switch to this one
 14    case when id is null then 'NO STATE'
 15         when id = 'TR' then 'TRIPURA'
 16         when id = 'MN' then 'MANIPUR'
 17         else 'OTHER STATE'
 18    end as state2,
 19    -- or use NVL
 20    case nvl(id, '-') when 'TR' then 'TRIPURA'
 21                      when 'MN' then 'MANIPUR'
 22                      when '-'  then 'NO STATE'
 23                      else 'OTHER STATE'
 24    end as state3
 25  from geography;

ID STATE       STATE2      STATE3
-- ----------- ----------- -----------
TR TRIPURA     TRIPURA     TRIPURA
TX OTHER STATE OTHER STATE OTHER STATE
   OTHER STATE NO STATE    NO STATE

SQL>
© www.soinside.com 2019 - 2024. All rights reserved.