3

我正在使用 Postgres 9.1。以下查询无法按预期工作。合并应该返回第一个非空值。但是,此查询返回 null (1?) 而不是日期 (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')不是 null,即使选择它返回 null 也是如此。

[ PS:以上删除线,以免误导。Postgres 没有错误,但不会将空字符串视为 null。见答案。]

4

1 回答 1

8
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)
);

并返回

| 合并 |
----------------------------------
| 2013 年 2 月 1 日 00:00:00+0000 |

这是SQLFiddle演示

于 2013-07-01T04:30:57.207 回答