2016-04-28 8 views
1

下記のクエリであなたの援助が必要です。助けてもらえますか?以下はケースステートメントが第2のケースを実行していません

Oracleデータベースからのサンプルレコードは、次のとおりです。

ID:

L7985W6W7W5HJYR5 
LJHGTIKFF89EE7HJJU7 
LIUH789KEHD7W9JHF 
LYUEJDJ8F2NIBRANCH 
LOI9DDH7E38BRANCH 
L8908HYS6WIBRANCH 
PJHS79209KJSJYIEJHSV12 

私の意図はb.branch_idが、それは先行ゼロとストリップ文字を削除しますLで始まる場合ですが、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

最後に枝を持つものだけを取りたい場合は、 '%BRANCH 'のように使用してください。 – Laurel

+0

最初のブランチの条件に一致すると、なぜ2番目のブランチに入ると思いますか? –

+0

これらは大文字小文字の区別ではなく、大文字小文字の表現です。 – jarlh

答えて

0

From the documentation:最初のための単純なCASE式、Oracleデータベースの検索で

THEN exprのcomparison_exprに等しく、return_exprを返すためにペアWHEN ...。シンプルなCASE式の場合
...
は、データベースにのみexprのとの比較ではなく、式exprでそれらのいずれかを比較する前に、すべてのcomparison_expr値を評価する前に、各comparison_expr値を評価します。あなたはまた、

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

を言うことができるが、それはに簡単です

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 

:あなたはそれ以外の場合は到達しません、最も制限のルールが最初に一致したように、case文を配置する必要がある

単一のLIKEパターンに結合する。

また、クエリにはwhere句が含まれているため、ケース式でL%が冗長になりますが、一時的なものかどうかはわかりません。そうである場合、ELSEは、Lで始まらないすべての値を処理することを望むかもしれません。

ローレルが指摘したように、値を 'BRANCH'で終わらせたい場合、最後のワイルドカード%記号は不要です。これは、BRANCHの後にさらに文字がある場合にも一致します。あなたのサンプルデータにはそれがありません。

関連する問題