2011-01-13 98 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