我不知道这是怎么回事,我试着这样做:
但结果永远不会返回0,我做错了什么?编辑:表中的所有行| 努姆|身份证|perc|| --------------|--------------|--------------|| 三|1|-20|| 三|十九岁|-10|| 三|五十八|-15|| 三|八十八|-50|| 三|三五一|-30|| 三|六零二|二十五|我使用“WHERE i.ID = '221'”是因为当表中不存在id为221的行时,我需要返回0。
ykejflvf1#
在Oracle中,CASE语句不会失败-它在第一次成功测试时中断/退出。因此,您的前两个测试:
WHEN (i.id IS NULL) THEN.. WHEN (i.id IS NOT NULL) THEN..
100%覆盖所有可能的情况。一个值是NULL或NOT NULL,所以这两个中的一个将是真的,你的测试的其余部分将永远不会被评估。我认为你可能需要单独的列来做你想要的各种测试。至少有一个列用于空性,一个列用于尺子,以及任何你需要的。至于下一个表达式,你有NVL(i.id,0),但在WHERE子句中你要求id = '221'。因为你只得到221的值,所以没有一行在id列中有NULL值,所以NVL不会产生0。
NVL(i.id,0)
id = '221'
e3bfsja22#
我想应该是下面这样的:
with qt as ( --- here comes your query returning the desired result if found ) select test from qt union all select 0 --- this produces 0 when your query returns no rows from dual where not exists (select 1 from qt)
2条答案
按热度按时间ykejflvf1#
在Oracle中,CASE语句不会失败-它在第一次成功测试时中断/退出。因此,您的前两个测试:
100%覆盖所有可能的情况。一个值是NULL或NOT NULL,所以这两个中的一个将是真的,你的测试的其余部分将永远不会被评估。我认为你可能需要单独的列来做你想要的各种测试。至少有一个列用于空性,一个列用于尺子,以及任何你需要的。
至于下一个表达式,你有
NVL(i.id,0)
,但在WHERE子句中你要求id = '221'
。因为你只得到221的值,所以没有一行在id列中有NULL值,所以NVL不会产生0。e3bfsja22#
我想应该是下面这样的: