瀑布案声明

时间:2019-01-16 16:22:14

标签: sql oracle if-statement case

我试图编写一个case语句,一旦它从每个“ WHEN”语句中找到正确的值,就返回一个值。一旦找到合格值,该查询就不应尝试评估其他语句。

(a -> b) -> (a -> c)

样本数据

SELECT
    DT1.COMPANY_ID
    , CASE
    WHEN DT1.RATING_NUMBER = 2 THEN DT1.UNIQUE_ENTRY_ID
    WHEN DT1.RATING_NUMBER = 1 THEN DT1.UNIQUE_ENTRY_ID
    WHEN DT1.RATING_NUMBER = 3 THEN DT1.UNIQUE_ENTRY_ID
     END AS UNIQUE_ENTRY_ID
FROM
    RATINGS_DATA DT1

每天都会发布每个公司的等级编号;有时是全部,有时不是全部)。如果等级编号为1,则会产生一个对应的唯一ID。如果等级编号为2,则会发布相应的ID。如果发布了评分“ 1”,则查询将带上公司ID和相应的create table COMP_RESULTS (COMPANY_ID varchar2(20),RATING_NUMBER number, UNIQUE_ENTRY_ID varchar2(20)); insert into COMP_RESULTS values ('Org00001','1','ENTRY_C1_1'); insert into COMP_RESULTS values ('Org00001','2','ENTRY_C1_2'); insert into COMP_RESULTS values ('Org00001','3','ENTRY_C1_3'); insert into COMP_RESULTS values ('Org00002','2','ENTRY_C2_2'); insert into COMP_RESULTS values ('Org00002','3','ENTRY_C2_3'); insert into COMP_RESULTS values ('Org00003','3','ENTRY_C3_3'); 。它不应理会第二个“ WHEN”语句。如果“ 1”号不存在,则尝试2号(如果不存在),然后尝试3等等,等等。

样品结果

UNIQUE_ENTRY_ID

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

case表达式一旦找到匹配项,便不会停止对术语的求值。所以我认为您是在问错问题。看起来您根本并不需要真正的case表达式。

根据示例数据和结果,您似乎希望使用first进行汇总,例如:

select dt1.company_id,
  max(dt1.unique_entry_id)
    keep (dense_rank first order by dt1.rating_number) as unique_entry_id
from comp_results dt1
group by dt1.company_id;

COMPANY_ID           UNIQUE_ENTRY_ID     
-------------------- --------------------
Org00001             ENTRY_C1_1          
Org00002             ENTRY_C2_2          
Org00003             ENTRY_C3_3          

这仍会评估每一行,但随后会汇总并仅保留最低rating_number的行-与您想要的优先顺序相匹配。

db<>fiddle

编辑后,如果等级编号不是按数字顺序排列的,则可以在[{1}}子句中添加一个case表达式,以指定所需的顺序:

order by

Updated db<>fiddle