WITH test AS(
SELECT to_date('2014-03-21','yyyy-mm-dd') a,to_date('2014-03-21','yyyy-mm-dd') b FROM dual UNION ALL
SELECT to_date('2014-03-19','yyyy-mm-dd') a,to_date('2014-03-11','yyyy-mm-dd') b FROM dual UNION ALL
SELECT NULL a,to_date('2014-03-21','yyyy-mm-dd') b FROM dual UNION ALL
SELECT to_date('2014-03-21','yyyy-mm-dd') a,NULL b FROM dual )
SELECT decode(greatest(a,b),a,b,b,a) FROM test

解决方案 »

  1.   

    decode(greatest(a,b),a,b,b,a)
    和你说一下原理哈。。这个函数是比大小取大值。。另外因为如果ab存在null时候该函数返回null.
    所以放在decode里面做相反取值非常合适。
    谁大就去另一个值,谁是null也是取另一个值。。
      

  2.   

    WITH ta AS
    (
    SELECT 1 a,2 b FROM dual UNION ALL
    SELECT 2 a,1 b FROM dual UNION ALL
    SELECT 1 a,NULL b FROM dual UNION ALL
    SELECT NULL a,NULL b FROM dual UNION ALL 
    SELECT NULL a,1 b FROM dual
    )
    SELECT LEAST(NVL(b,a),NVL(a,b)) FROM ta
      

  3.   

    再给一种解法:
    WITH ta AS
    (
    SELECT 1 a,2 b FROM dual UNION ALL
    SELECT 2 a,1 b FROM dual UNION ALL
    SELECT 1 a,NULL b FROM dual UNION ALL
    SELECT NULL a,NULL b FROM dual UNION ALL 
    SELECT NULL a,1 b FROM dual
    )
    SELECT coalesce (LEAST(a,b),a,b) FROM ta
      

  4.   

    select  decode(a.XX,null,b.XX,decode(sign(a.xx-nvl(b.xx,a.xx-1)),a.xx,b.xx))
    from a,b
    大致这个意思。
      

  5.   


    WITH test AS(
    SELECT to_date('2014-03-21','yyyy-mm-dd') a,to_date('2014-03-21','yyyy-mm-dd') b FROM dual UNION ALL
    SELECT to_date('2014-03-19','yyyy-mm-dd') a,to_date('2014-03-11','yyyy-mm-dd') b FROM dual UNION ALL
    SELECT NULL a,to_date('2014-03-21','yyyy-mm-dd') b FROM dual UNION ALL
    SELECT to_date('2014-03-21','yyyy-mm-dd') a,NULL b FROM dual )
    SELECT decode(greatest(a,b),a,b,b,a) FROM test
    佩服,佩服,思路很好
      

  6.   

    select greatest(nvl(a,b),nvl(b,a)) from dual 这个吧,还算简单。
      

  7.   


    上面是取大的,下面是取小的。
    select least(nvl(a,b),nvl(b,a)) from dual 
      

  8.   

    1 GREATEST 返回值列表中最大值
        格式: GREATEST(value1, value2, value3, ...)
        含义: 返回value列表最大的值。
                   value列表必须是相同类型,也可以是一个表的同一行、不同列的值进行比较。
                   当value值列表中有一个为NULL,则返回NULL值。
        EXAMPLE: select greatest (1, 3, 2 ) from dual ; -- 返回3
                         select greatest ( 'A', 'B', 'C' ) from dual ; -- 返回C
                         select greatest (null, 'B', 'C' ) from dual ; -- 返回null
                         select greatest (t.empno, t.mgr ) from  scott.emp t ; -- 返回empno和mgr 较大值
    2. LEAST 返回值列表中最小值
        格式: LEAST(value1, value2, value3, ...)
        含义: 返回value列表最小的值。
                   value列表必须是相同类型,也可以是一个表的同一行、不同列的值进行比较。
                   当value值列表中有一个为NULL,则返回NULL值。
        EXAMPLE: select least (1, 3, 2 ) from dual ; -- 返回1
                         select least ( 'A', 'B', 'C' ) from dual ; -- 返回A
                         select least (null, 'B', 'C' ) from dual ; -- 返回null
                         select least (t.empno, t.mgr ) from  scott.emp t ; -- 返回empno和mgr 较小值
    nvl(a,b)----如果a is null 则就取b
    select least(nvl(null,'b'),nvl(null,'a')) from dual结果就是a