首页 文章

合并和案例 - 当To_Date无法按预期工作时(Postgres bug?)

提问于
浏览
0

我正在使用Postgres 9.1 . 以下查询无法按预期方式工作 . 合并应返回 first non-null value . 但是,此查询返回null(1?)而不是date(2) .

select COALESCE(
    TO_DATE('','yyyymmdd'), --(1)
    TO_DATE('20130201','yyyymmdd') --(2)
    );

--(1) this evaluates independently to null
--(2) this evaluates independently to the date,
--    and therefore is the first non-null value

我究竟做错了什么?任何解决方法?

编辑:这可能与Coalesce毫无关系 . 我尝试了Case When构造的一些实验;事实证明,Postgres有这个大丑陋的bug,它将 TO_DATE('','yyyymmdd') 视为 not null ,即使选择它返回null .

[PS:打击以上以避免误导 . Postgres没有bug,而是将空字符串视为null . 见答案 . ]

1 回答

  • 4
    SELECT TO_DATE('','yyyymmdd');
    

    因为您将空字符串而不是 NULL 作为参数传递给 TO_DATE() ,所以不会计算为 NULL

    这将成功评估为NULL

    SELECT TO_DATE(NULL,'yyyymmdd');
    

    如果你期望一个空字符串并希望将其视为 NULL ,你可以使用 NULLIF()

    SELECT TO_DATE(NULLIF(dt, ''),'yyyymmdd')
      FROM 
    (
      SELECT CAST('' AS VARCHAR(32)) dt
    ) q
    

    这就是说你的示例代码将(1)计算为NULL

    SELECT COALESCE(
        TO_DATE(NULLIF('', ''),'yyyymmdd'),       --(1)
        TO_DATE(NULLIF('20130201',''),'yyyymmdd') --(2)
    );
    

    并返回

    |                        COALESCE |
    -----------------------------------
    | February, 01 2013 00:00:00+0000 |
    

    这是 SQLFiddle 演示

相关问题