2016-04-28 69 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之後還有更多字符,也會匹配。你的樣本數據中沒有。