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

时间:2013-07-01 03:50:35

标签: sql postgresql postgresql-9.1 to-date

我正在使用Postgres 9.1。以下查询无法按预期工作。 Coalesce应返回第一个非空值。但是,此查询返回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有这个大丑陋 ,它将TO_DATE('','yyyymmdd')视为 not null ,即使选择它返回null。

[ PS:罢工,以避免误导。 Postgres没有bug,而是将空字符串视为null。见答案。]

1 个答案:

答案 0 :(得分:4)

SELECT TO_DATE('','yyyymmdd');
由于您将空字符串而不是NULL作为参数传递给NULL

,因此

不会计算为TO_DATE()

这将成功评估为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 演示