2009-07-16 17 views
0

Hy人、Oracleサブセレクトを使用してCASE文を置き換える

誰でもOracleデータベース10gのサブクエリを手伝ってもらえますか?私は、2番目のテーブルの別の列の値として最初のテーブルの列の値を抽出する必要があります。 私は現在、この文を使用します。

SELECT 
CASE WHEN A.column1 = 'A' THEN 'aaa' 
WHEN A.column1 = 'B' THEN 'bbb' 
....... 
WHEN A.column1 = 'X' THEN 'xxx' 
ELSE 'bad' END AS COLUMN1, A.* 
FROM TRANSACTION_TABLE A, CATEGORY_TABLE B 
WHERE A.column1 IS NOT NULL 
AND A.column1 <> ' ' 

これはエレガントなアプローチではありませんので、私は次のようにCATEGORY_TABLE Bから副選択を使用しようとしている:

だから、
SELECT A.column1, A.* 
FROM TRANSACTION_TABLE A, CATEGORY_TABLE B 
WHERE A.column1 IS NOT NULL 
AND A.column1 = B.column_b_1 
AND A.column1 <> ' ' 
AND A.column1 IN (SELECT B.column_b_1_descr FROM CATEGORY_TABLE B 
WHERE B.FIELDNAME = 'column1' AND A.column1 = B.column_b_1) 

、私はいずれかを取得することはできませんサブクエリを使用して結果を得て、多くの条件に対してCASEを使用したくない場合は、読みやすいようにA.column1の値をB.column_b_1_descrの記述的な値に置き換えます。 私はフィードバックをいただければ幸いです。 おかげ

+0

明確にするために、column1が 'A'のときは出力行の「column1」フィールドの文字列「aaa」を、「* aaa」という列の値ではないでしょうか? –

答えて

1

私はあなたの質問を誤解していない限り...

CATEGORY_TABLE: 
    name | value 
    A  aaa 
    B  bbb 
    C  ccc 
... 


SELECT B.value AS COLUMN1, A.\* 
FROM TRANSACTION\_TABLE A, CATEGORY\_TABLE B 
WHERE A.column1 = B.name 

または

SELECT t2.value as COLUMN1, t1.\* 
FROM TRANSACTION\_TABLE t1 
INNER JOIN CATEGORY\_TABLE t2 ON t1.column1 = t2.name; 

インナーが自動的にNULL値を持つ行を除外したり参加するので句は、必要ありませんザ・一致するものはありません。

+2

「悪い」値を保持する場合は、これをOUTER JOINに変え、SELECTの最初の部分を「COLUMN1」として「合体(t2.value、 'bad')」に変更します。 –

関連する問題