2016-04-28 74 views
1

我需要您的协助以下查询。你能帮忙吗?没有执行第二种情况的案例陈述

下面是从Oracle数据库样本记录:

ID:

L7985W6W7W5HJYR5 
LJHGTIKFF89EE7HJJU7 
LIUH789KEHD7W9JHF 
LYUEJDJ8F2NIBRANCH 
LOI9DDH7E38BRANCH 
L8908HYS6WIBRANCH 
PJHS79209KJSJYIEJHSV12 

我的本意是,如果b.branch_idL开始,那么它会删除前导零和带字符,但b.branch_id‘%BRANCH%'然后结束我希望它与另一个字段合并,但不起作用。第一部分是工作,如果它开始L然后它的工作,但不知何故从未执行‘%BRANCH%'部分。

Select distinct b.branch_id, 
b.branch_date 

CASE 
WHEN b.branch_id like L%' 
    THEN TRIM(substr((TO_CHAR(TRIM(LEADING 0 FROM b.branch_id))),-10)) 
    WHEN b.branch_id like ‘%BRANCH%' 
    THEN substr(b.branch_loc,2,9) || substr(i.branch_name,1,9) 
     END AS BRANCH_INFO 

from tbl_brach b 
JOIN tbl_branch_info i 
on b.branch_id = i.branch_id_key 

where b.branch_id like L%' 
+1

如果你只想在最后得到分支的东西,你应该使用'like'%BRANCH'' – Laurel

+0

为什么你会期望当它匹配第一个分支的条件时它进入第二个分支? –

+0

这些是case表达式,而不是case语句。 – jarlh

回答

0

From the documentation

在简单的情况下表达,对于第一Oracle数据库搜索时... THEN配对为其EXPR等于comparison_expr并返回RETURN_EXPR
...
对于一个简单的CASE表达式,数据库只是它比较EXPR,而不是EXPR比较任何人之前,评估所有comparison_expr值之前评估每个comparison_expr值。

你需要安排的情况下语句,因此最严格的规则被优先匹配,否则它永远不会达到:

CASE 
    WHEN b.branch_id like ‘L%BRANCH%' 
    THEN substr(b.branch_loc,2,9) || substr(i.branch_name,1,9) 
    WHEN b.branch_id like L%' 
    THEN TRIM(substr((TO_CHAR(TRIM(LEADING '0' FROM b.branch_id))),-10)) 
END AS BRANCH_INFO 

你也可以说

WHEN b.branch_id LIKE 'L%' AND b.branch_id LIKE '%BRANCH%' THEN 

但它的简单组合成单个LIKE模式。

您的查询还有一个where子句,它使表达式中的L%表达式变得冗余,但我不确定这是否是暂时的。如果是,那么你可能需要一个ELSE来处理所有不以L开头的值,除非你希望它们(隐含地)为空。

正如Laurel指出的那样,如果您希望值以'BRANCH'结尾,那么您不需要最终的通配符%符号,因为如果BRANCH之后还有更多字符,也会匹配。你的样本数据中没有。