Oracle PL / SQL - DECODE语句

时间:2011-01-13 17:26:30

标签: sql plsql

应该使用两列:Customer_num是第一个,但如果为null,则使用Vendor_num。

更具体地说,我需要编写一个DECODE语句,它将返回以下内容:

如果Customer_num IS NOT NULL,则返回Customer_num 如果Customer_num为NULL,则返回Vendor_num 如果Vendor_num为空或如果Customer_num为NULL,则返回Customer_num

我该怎么做?

...谢谢

4 个答案:

答案 0 :(得分:4)

我认为你正在寻找COALESCE

COALESCE(Customer_num,Vendor_num)

请注意最后一项要求

  

如果Vendor_num为空或者如果Customer_num为NULL,则返回Customer_num

将返回Customer_num(因为第一个要求)或当它们都为空时返回NULL。

答案 1 :(得分:2)

我同意其他海报的说法,“更好”的方法是使用NVL或COALESCE。但是,虽然我没想到这会起作用,但似乎以下内容会按照您的要求执行:

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

奇怪的是,我们可以使用DECODE将值与NULL进行比较并使其返回(显然)为TRUE。在我看来,上面的代码在概念上与

相同
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子句一样。感谢您提出这个有趣的小问题。

答案 2 :(得分:0)

您的问题不是 清除。

但您可以尝试使用nvl

select nvl(customer_num, vendor_num)
  from your_table;

答案 3 :(得分:0)

尝试

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