2009-07-16 131 views
0

Hy guys,使用Oracle子查詢替換CASE語句

任何人都可以幫我一個Oracle數據庫10g的子查詢嗎?我需要提取第一個表中列的值作爲第二個表中另一列的值。 我目前使用的這種說法:

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,只想用B.column_b_1_descr中的描述值替換A.column1值,因爲它們更易於閱讀。 我會很感激任何反饋。 感謝

+0

爲了澄清,當column1爲'A'時,您希望輸出行中「column1」字段的字符串'aaa',而不是列*中的值*'aaa',對不對? – 2009-07-16 01:12:10

回答

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; 

將在不需要條款,因爲內連接自動排除空值或行無匹配。

+2

如果你想保留'壞'值,把它變成一個OUTER JOIN,並將SELECT的第一部分改爲「SELECT Coalesce(t2.value,'bad'),如COLUMN1,... – 2009-07-16 04:56:18