查找db2中两列之间的最大可空日期

7lrncoxx  于 2023-03-23  发布在  DB2
关注(0)|答案(3)|浏览(191)

我在Db2中有一个名为myTable的表。
它有几列:

a |  b    | date1        |  date2
---------------------------------------------
1    abc     <null>        2014-09-02
2    aax     2015-12-30    2016-09-02
2    bax     2015-10-20    <null>
2    ayx     2014-12-10    2016-02-12

从上面的值可以看出,date1date2也可以具有null值。
我怎样才能同时得到date1date2
也就是说,查询的输出应该是2016-09-02,因为这是date1date2中所有日期的最大日期。
我用的是Db2-9。
感谢阅读!

xmjla07d

xmjla07d1#

如何使用UNION查询:

SELECT MAX(t.newDate)
FROM
(
    SELECT date1 AS newDate
    FROM myTable
    UNION
    SELECT date2 AS newDate
    FROM myTable
) t

另一种选择:

SELECT CASE WHEN t.date1 > t.date2 THEN t.date1 ELSE t.date2 END
FROM
(
    SELECT (SELECT MAX(date1) FROM myTable) AS date1,
           (SELECT MAX(date2) FROM myTable) AS date2
    FROM SYSIBM.SYSDUMMY1
) t
tgabmvqs

tgabmvqs2#

MAX()是一个有趣的野兽...
它既可以作为标量函数使用,也可以作为聚合函数使用。
所以你真正需要的是

select max(max(coalesce(date1,'0001-01-01')
              ,coalesce(date2,'0001-01-01') 
              )
          )
from mytable

外部MAX()是聚合版本,内部是标量版本。

jhkqcmku

jhkqcmku3#

声誉太低,无法评论,但我想扩展Charles提供的解决方案。
1.两个NOT NULL值的MAX
1.如果其中一个值为NULL,则剩余的NOT NULL值
1.如果两个值都为NULL,则结果应该为NULL
对于响应中的每一行。
以下代码将满足所有要求,并为响应中的每个结果返回一行:

SELECT
    NULLIF(
        MAX(
            COALESCE(DATE1, '0001-01-01')
            , COALESCE(DATE2, '0001-01-01')
        )
        , '0001-01-01')
FROM MYTABLE

如果没有NULLIF(),这里的问题将是,NULL值将返回为'0001-01-01'。
与UNION解决方案相比的另一个优点是,可以使用子选择而不是显式引用DATE 1和DATE 2,引用外部SQL中的列,为SQL结果集中的每行获取两个日期的最大日期值,例如。

SELECT
    MYTABLE.SEQ,
    NULLIF(
        MAX(
            COALESCE( ( SELECT DATE1 FROM MYDATETABLE1 WHERE MYDATETABLE1.FK = MYTABLE.SEQ ORDER BY DATE1 DESC FETCH FIRST 1 ROW ONLY ) , '0001-01-01')
            , COALESCE( ( SELECT DATE2 FROM MYDATETABLE2 WHERE MYDATETABLE2.FK = MYTABLE.SEQ ORDER BY DATE2 DESC FETCH FIRST 1 ROW ONLY ) , '0001-01-01')
        )
    , '0001-01-01') AS MAXDATE
FROM MYTABLE

为了解决您的原始案例,这里有一个可能的解决方案:

DROP TABLE TMPTABLE;

CREATE TABLE TMPTABLE (
    a INT
    ,b VARCHAR(254)
    ,date1 DATE
    ,date2 DATE
    );

INSERT INTO TMPTABLE
VALUES (1,'abc',CAST(NULL as DATE),'2014-09-02')
    ,(2,'aax','2015-12-30','2016-09-02')
    ,(3,'bax','2015-10-20',CAST(NULL as DATE))
    ,(4,'ayx','2014-12-10','2016-02-12')
    ,(5,'null',CAST(NULL as DATE),CAST(NULL as DATE));

SELECT
    a,
    b
    ,date1
    ,date2
    ,NULLIF(
        MAX(
            COALESCE(date1, '0001-01-01'),
            COALESCE(date2, '0001-01-01')
        )
    , '0001-01-01') as MAXDATE
FROM TMPTABLE;

| A类|B|日期1|DATE2|最大日期|
| - ------|- ------|- ------|- ------|- ------|
| 1个|美国广播公司|零|2014年9月2日|2014年9月2日|
| 第二章|阿克斯|二〇一五年十二月三十日|2016年9月2日|2016年9月2日|
| 三个|巴克斯|2015-10-20 2015-10-20|零|2015-10-20 2015-10-20|
| 四个|艾克斯|2014年12月10日|2016-02-12 2016 -02-12|2016-02-12 2016 -02-12|
| 五个|零|零|零|零|

相关问题