2013-10-04 13 views
6

我想比較兩列中的兩個日期並獲得最大值,然後與日期值進行比較。兩列也可以保存NULL值。例如,我想要下面的OUTPUT.How我使用最大的功能,或者如果有其他的東西。我再次使用輸出來比較另一個日期。在Oracle中最大函數中處理NULL

Col A   Col B   OUTPUT 
--------------------------------------- 
NULL   NULL   NULL 
09/21/2013 01/02/2012  09/21/2013 
NULL   01/03/2013  01/03/2013 
01/03/2013 NULL   01/03/2013 

回答

3

使用Oracle CASE... WHEN structure在你的選擇(未經測試):

SELECT COLA, COLB, CASE 
    WHEN (COLA > COLB OR COLB IS NULL) 
    THEN COLA 
    WHEN (COLA < COLB OR COLA IS NULL) 
    THEN COLB 
    WHEN (COLA = COLB) 
    THEN COLA 
    ELSE NULL 
    END 
    AS OUTPUT 
FROM ... 
0

喜歡的東西

SELECT CASE WHEN ColA is NULL and ColB is NULL then NULL 
WHEN coalesce(ColA, '01/01/1753')>coalesce(ColB, '01/01/1753') then ColA 
ELSE ColB END as Output 
+0

如果你使用'TO_DATE()'周圍的魔法日期這樣的作品,最好是使用特定日期格式模型;或者最好(親自)使用ANSI日期符號作爲日期'1753-01-01'。 –

+0

謝謝是的,它工作 –

5

使用a case expression處理null值另一個版本:

select cola, colb, 
    case when cola is null and colb is null then null 
    when cola is null then colb 
    when colb is null then cola 
    else greatest(cola, colb) 
    end as output 
from <table>; 

COLA  COLB  OUTPUT 
---------- ---------- ---------- 

09/21/2013 01/02/2012 09/21/2013 
      01/03/2013 01/03/2013 
01/03/2013   01/03/2013 
+0

非常感謝這個幫助,我將實現這個 –

0

我試圖this..found谷歌搜索

WITH ABC AS (SELECT NULL AS col1 , NULL AS col2 FROM dual UNION 
SELECT NULL , DATE'2013-08-12' FROM dual UNION 
    SELECT DATE'2013-08-12' , NULL FROM dual UNION 
    SELECT DATE'2013-08-12', DATE'2013-09-12' FROM dual) 

    SELECT col1, col2 , substr(greatest('x'||col1,'x'||col2),2) 
     FROM ABC; 
+0

這是做你的日期列隱式轉換爲字符串,使用任何你當前的'NLS_DATE_FORMAT',然後比較字符串,而不是日期。使用'MM/DD/YYYY'設置,如果日期處於不同年份,則無法使用;在最後一行將第二個日期更改爲「2012-09-12」,並且它仍然會報告「大於」「2013-08-12」 - 因爲它實際上比較了「2009/12/2012」和「 '08/12/2013'',這是字符串比較的真實情況...... –

+0

ohh我明白了,非常感謝這些信息。我正要實現這個 –

+0

@Alex:再次感謝您。 –

2

後,如果你有很多的列來比較(超過2或3),然後處理所有的各種工況組合可能會笨拙。你可以嘗試(11克):

with x as (
    select 1 as id, sysdate - 30 as col1, sysdate-50 as col2, sysdate-20 as col3,null as col4, sysdate-1 as col5 from dual 
    union 
    select 2 as id, sysdate - 10 as col1, sysdate-20 as col2, null as col3,null as col4, sysdate-35 as col5 from dual 
    union 
    select 3 as id, null as col1, null as col2, null as col3, null as col4, null as col5 from dual 
) 
select id, max(dates) 
from x 
UNPIVOT INCLUDE NULLS 
(dates FOR colname IN (col1,col2,col3,col4,col5)) 
group by id 
7

你可以嘗試以下操作:

SELECT cola, colb, COALESCE(GREATEST(cola, colb), cola, colb) AS output 
    FROM yourtable; 

原因COALESCE()GREATEST()回報NULL如果任一參數爲NULL

5

您的問題具體涉及兩列,但我遇到了需要多於兩列的GREATEST/LEAST的情況。在這些情況下,您可以使用COALESCE並將解決方案擴展到所需的列數。

下面是有三列abc一個例子:

GREATEST(
    COALESCE(a, b, c), 
    COALESCE(b, c, a), 
    COALESCE(c, a, b) 
) 

注意的COALESCE變化列排序以使得每個輸入柱是第一要素COALESCE至少一次。只有當所有輸入列都爲NULL時,纔會返回NULL。

在「通解」的COALESCE語句的數量將等於輸入列數:

GREATEST(
    COALESCE(col1, col2, col3, col4, ....), 
    COALESCE(col2, col3, col4, ...., col1), 
    COALESCE(col3, col4, ...., col1, col2), 
    COALESCE(col4, ...., col1, col2, col3), 
    COALESCE(...., col1, col2, col3, col4), 
    ... 
)