使用 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
总是评估这两个参数,不管它是否需要。如果第二个参数是一个函数,它每次都会运行,即使第一个参数不为空。 CASE
和 COALESCE
都将执行逻辑短路,这意味着它们将在第一个条件为真时停止。
一般来说,我的首选选项是使用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 .. Oracle SQL 中的 WHEN 表达式
Oracle SQL 查询使用 case when,压缩空字段
Oracle SQL:对 CASE WHEN 重复使用子查询,而无需重复子查询