2011-01-13 50 views
1

應使用兩列:Customer_num是第一個,但如果爲null,則使用Vendor_num。Oracle PL/SQL - DECODE語句

更具體,我需要寫一個DECODE語句,將返回以下內容:

如果CUSTOMER_NUM IS NOT NULL,則返回CUSTOMER_NUM 如果CUSTOMER_NUM爲NULL,則返回Vendor_num 如果Vendor_num爲null,或者CUSTOMER_NUM IS NULL然後返回Customer_num

我該怎麼做?

謝謝...

回答

0

你的問題是不是清楚。

但是你可以嘗試使用nvl

select nvl(customer_num, vendor_num) 
    from your_table; 
+0

不用擔心,我自己用NVL(DECODE(..))算出來了。謝謝。 – valmont74 2011-01-13 18:49:02

4

我認爲你正在尋找

COALESCE(CUSTOMER_NUM,Vendor_num)

注意這最後一個要求

如果Vendor_num爲NULL或者如果Customer_num爲NULL,則返回Customer_num

將重新調用Customer_num(由於第一個要求)或NULL時它們都爲null。

+0

不用擔心,我使用NVL(DECODE(..))自己計算出來的。謝謝。 – valmont74 2011-01-13 18:49:45

0

嘗試

SELECT coalesce(expr1, expr2, ... expr_n) 
FROM DUAL; 
+0

這不是我一直在尋找,但仍然感謝。我自己使用DECODE來解決它。直到現在,我還沒有意識到COALESCE。再次感謝。 – valmont74 2011-01-13 18:47:29

2

我與其他海報的「更好」的方式來做到這一點是使用NVL或COALESCE同意。不過,雖然我沒想到這個工作,看來下面會做你問:

SELECT DECODE(CUSTOMER_NUM, 
       NULL, DECODE(VENDOR_NUM, 
           NULL, CUSTOMER_NUM, 
             VENDOR_NUM), 
         CUSTOMER_NUM) 
    FROM DUAL; 

有什麼奇怪的是,我們可以用DECODE來比較值設置爲NULL,並使其返回(顯然)真正。在我的腦海裏上面的代碼在概念上是一樣的

IF CUSTOMER_NUM = NULL THEN 
    IF VENDOR_NUM = NULL THEN 
    RETURN CUSTOMER_NUM; 
    ELSE 
    RETURN VENDOR_NUM; 
    END IF; 
ELSE 
    RETURN CUSTOMER_NUM; 
END; 

顯然DECODE是足夠明亮,猶如使用NULL子句的IS執行比較爲NULL。感謝您提出這個有趣的小問題。

+0

謝謝,`DECODE`語句包裝在'SELECT`中`... FROM DUAL`對我來說工作得很好,儘管它可能會更清晰地使用'CASE`。 – peterp 2013-02-08 09:23:06