DB2 Exclude Nulls或设置为任意日期

时间:2009-08-04 20:01:11

标签: sql db2

我在DB2中处理null返回时非常困难。我尝试过IFNULL AND COALESCE功能,但我最终还是得到了回报中的价值。

以下是查询的相关部分:

COALESCE (
    DATE (
        SUBSTR (DIGITS (PODATE),1,2) || char ('/') ||
        SUBSTR (DIGITS (PODATE),3,2) || char ('/') ||
        SUBSTR (DIGITS (PODATE),5,2)
    ),
    DATE ('12/31/99')
) AS PODATE

返回,但我仍然得到空值。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

首先,我不会合并像date()这样的每行函数。你最好测试NULL的实际字段,如下例所示:

create table a (podate varchar(8));                                          
insert into a (podate) values ('20090101');
insert into a (podate) values ('20090102');
insert into a (podate) values ('20090103');
insert into a (podate) values (null);
commit;
select
    case when podate is null
        then date('2000-01-01')
        else date(substr(podate,1,4) || '-' ||
                  substr(podate,5,2) || '-' ||
                  substr(podate,7,2))
    end as mydate
from a;
drop table a;
commit;

输出:

---------
MYDATE
----------
2009-01-01
2009-01-02
2009-01-03
2000-01-01
DSNE610I NUMBER OF ROWS DISPLAYED IS 4

在您的情况下,代码看起来像:

select case when podate is null
       then date('12/31/99')
       else date (substr (podate,1,2) || char ('/') ||
                  substr (podate,3,2) || char ('/') ||
                  substr (podate,5,2)
       end

我没有测试您的具体案例,因为我的DB / 2没有设置为美国日期格式。这也是值得关注的东西。在不使用美国日期格式的平台上,这可能效果不佳。

理想情况下,日期应作为日期存储在数据库中,而不是字符串。换句话说,当数据进入表时,转换成本应一次,而不是数百万次,您将要提取它。然后您的代码变得更简单,更快:

select case when podate is null
       then date('12/31/99')
       else podate
       end

或者,如果您永远不会将该哨兵日期视为真实日期,请不要存储NULL。相反,当它们进入表格时将它们转换为date('12/31/99'),并使用:

select podate

它没有比那更简单或更快(假设你对非NULL哨兵感到满意)。

答案 1 :(得分:0)

您可以尝试使用 ISO格式的字符串作为Pax隐式建议而不是您使用的与语言环境相关的字符串。无论您的区域设置日期格式设置如何,此SQL语句将始终有效

SELECT DATE('2009-04-01')
FROM SYSIBM.SYSDUMMY1

另一方面,要分解数字字段,使用除法 modulo 有时候是一个不错的伎俩。然后,您可以对其使用数字比较。

提供样本数据Pax:

SELECT 
    MOD(PODATE / 10000, 100) AS YEAR,
    MOD(PODATE / 100, 100) AS MONTH,
    MOD(PODATE, 100) AS DAY
FROM (VALUES (991231), (090101), (null)) AS A (PODATE)

但正如Pax所说:日期应该作为日期存储在数据库中,而不是字符串。 数值类型与数值类型等相同