我试图编写一个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
有人可以帮忙吗?
答案 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
的行-与您想要的优先顺序相匹配。
编辑后,如果等级编号不是按数字顺序排列的,则可以在[{1}}子句中添加一个case表达式,以指定所需的顺序:
order by