我使用的是 Postgres 9.1。 以下查询未按预期工作。 Coalesce 应该返回第一个非空值。但是,此查询返回 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')
视为 not null,即使选择它也会返回 null。
[附注:在上面划掉以避免误导。 Postgres 没有错误,但不会将空字符串视为 null。查看答案。]
最佳答案
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 演示
关于sql - Coalesce 和 Case-When with To_Date 没有按预期工作(Postgres 错误?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17397183/