使用 SQL ORACLE 在 CASE WHEN 中未获取记录时如何设置自定义值?

Posted

技术标签:

【中文标题】使用 SQL ORACLE 在 CASE WHEN 中未获取记录时如何设置自定义值?【英文标题】:How to put customized value when records not fetched in CASE WHEN using SQL ORACLE? 【发布时间】:2018-11-20 11:54:09 【问题描述】:

假设我有两个表,分别是 Table1 和 Table2,数据如下: 表1

Id
__
id1
id2
id3
id4
id5

表2

Id  rank
--  ---
Id1 1
Id2 2

现在,我想做一个 orcale SQL 查询,返回如下:

Id  rank
--  ---
Id1 1
Id2 2
Id3 0
Id4 0
Id5 0

我已经创建了以下 SQL,但它没有返回所需的结果。

SELECT TAB1.ID,(SELECT CASE
    WHEN TAB2.RANK IS NULL THEN TAB2.RANK
    ELSE 0
    END FROM TABLE2 TAB2 WHERE  TAB2.ID=TAB1.ID) as RANK FROM TABLE1 TAB1;

返回如下:

Id  rank
--  ---
Id1 1
Id2 2
Id3 null
Id4 null
Id5 null

【问题讨论】:

我想你的意思是when tab2.rank is not null 【参考方案1】:

应该是一个简单的左连接:

SELECT tab1.id, coalesce(tab2.rank,0) as rank
FROM tab1
LEFT JOIN tab2 ON tab1.id = tab2.id

【讨论】:

【参考方案2】:

使用左连接和coalesce()。 coalesce() 返回第一个非空值,因此当 id 不匹配时,它将返回 0

 select t1.id,coalesce(t2.rank,0)
 from table1 t1
 left join table2 t2
 on t1.id=t2.id

【讨论】:

【参考方案3】:

使用 coalesce() 函数

SELECT TAB1.ID,coalesce((SELECT CASE
    WHEN TAB2.RANK IS NULL THEN TAB2.RANK
    ELSE 0
    END FROM TABLE2 TAB2 WHERE  TAB2.ID=TAB1.ID),0) as RANK FROM TABLE1 TAB1;

【讨论】:

【参考方案4】:

使用coalesce()left join 怎么样?

select t1.id, coalesce(t2.rank, 0) as rank
from table1 t1 left join
     table2 t2
     on t1.id = t2.id

【讨论】:

【参考方案5】:

其他答案都是正确的,如果id 列是唯一的,那绝对是我的做法。

但是,要解释如何使用标量子查询执行您想要的操作,您需要先执行标量子查询,然后确定如何处理结果,所以它看起来像:

select id,
       case when rank is null then 0 else rank end rank1,
       coalesce (rank, 0) rank2,
       nvl (rank, 0) rank3
from   (select tab1.id,
               (select tab2.rank from table2 tab2 where tab2.id = tab1.id) rank
        from   table1 tab1);

注意我给了你 3 种方法来产生你所追求的等级:

CASE - 这个可以用,但是有点啰嗦。 COALESCE - 返回提供的参数列表中的第一个非空值 NVL - 在这种情况下可以使用它,因为第二个值是一个常数。然而,NVL 总是评估这两个参数,不管它是否需要。如果第二个参数是一个函数,它每次都会运行,即使第一个参数不为空。 CASECOALESCE 都将执行逻辑短路,这意味着它们将在第一个条件为真时停止。

一般来说,我的首选选项是使用COALESCE

【讨论】:

【参考方案6】:

这将起作用:

select a.id,case when b.rank is not null then
b.rank else 0 end
from 
table1 a,table2 b where
a.id=b.id;

【讨论】:

以上是关于使用 SQL ORACLE 在 CASE WHEN 中未获取记录时如何设置自定义值?的主要内容,如果未能解决你的问题,请参考以下文章

case-when oracle sql的动态评估

CASE .. Oracle SQL 中的 WHEN 表达式

Oracle SQL 查询使用 case when,压缩空字段

Oracle SQL:对 CASE WHEN 重复使用子查询,而无需重复子查询

使用 SQL ORACLE 在 CASE WHEN 中未获取记录时如何设置自定义值?

如何在 Oracle SQL 中不使用 distinct 选择从多个 max(case when) 派生的唯一行