2011-06-01 35 views
7

我有一個oracle查詢,它的一部分是使用DECODE計算一些值。例如:oracle:解碼和子查詢選擇結果

SELECT ..., 
     (SELECT DECODE((SELECT 23 FROM DUAL), 
         0, null, 
        (SELECT 23 FROM DUAL)) 
     FROM DUAL) 
    FROM ... 

這裏的「23」的值在運行時被計算,這是相當複雜的連接 - 多個表,使用PARTITION BY等,所以我想避免執行相同的子查詢,如果該值不爲「0 」。有沒有辦法寫這樣的東西

SELECT ..., 
     (SELECT DECODE ((SELECT 23 FROM DUAL) as test, 
         0, null, 
         test) 
     FROM DUAL) 
    FROM ... 

回答

9

這會爲你工作嗎? 我剛剛將「23」移至帶有描述別名的內聯表。

select ..., 
    (
    select 
    decode ( 
      computed_value.val, 
      0, null, 
      computed_value.val 
      ) 
    from 
    (select 23 as val from dual) computed_value 
) 
from 
    ... 

case語句也可能會增加透明度,如:

select 
    ... 
,case when computed_value.val = 0 
     then null 
     else computed_value.val 
     end as my_field 
from 
    (select 23 as val from dual) computed_value 
    ... 
+0

感謝您的簡單和有用的輸入。 – hanumant 2011-06-01 04:59:24

0

您可以使用子查詢中FROM子句和做類似如下:

select conf_key, decode(test, 0, null, test) from (
select conf_key, (select conf_value from config_values where conf_key = 'DOMAINID') as TEST from config_values) 
1

或者:

WITH q AS (
SELECT 23 test, 16 test2 FROM dual 
) 
SELECT ... 
    , DECODE(q.test, 0, NULL, q.test) value 
    , CASE WHEN q.test2 = 0 THEN NULL 
      WHEN q.test2 = 16 THEN 1 
      ELSE q.test2 
     END another_value 
    FROM q, ... 

讓您使用查詢「q」thro不要超出你的主要選擇,哪裏允許子查詢。調用WITH子句或公用表達式或子查詢因子分解。在Oracle-Base.com閱讀更多關於它。

+0

嗨@DCookie,感謝您的輸入。由於子查詢使用來自外部查詢的一些值,因此我不能使用'with as'。 – hanumant 2011-06-01 05:00:52

1

對於這種特殊的情況下,您可以使用NULLIF功能:

SELECT ..., 
     (SELECT NULLIF((SELECT 23 FROM DUAL), 0) 
     FROM DUAL) 
    FROM ... 

NULLIF函數返回NULL如果兩個參數相等,否則返回第一個參數。

0

更好的是你會使用CASE語句。因爲CASE語句就像一系列IF語句,只使用關鍵字WHEN。 CASE語句從上到下進行評估。如果條件爲真,則執行相應的THEN子句並執行跳轉到END CASE(短路評估)子句。