ADT*_*DTC 2 sql postgresql to-date postgresql-9.1
我正在使用 Postgres 9.1。以下查询未按预期工作。Coalesce 应该返回第一个非空值。但是,此查询返回空值 (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
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?任何解决方法?
编辑:这可能与 Coalesce 完全无关。我用 Case When 构造尝试了一些实验;事实证明,Postgres 有一个丑陋的大错误,它会将其TO_DATE('','yyyymmdd')视为not null,即使选择它返回 null。
[ PS:删除上面以避免误导。Postgres 没有错误,但不会将空字符串视为空字符串。见答案。]
SELECT TO_DATE('','yyyymmdd');
Run Code Online (Sandbox Code Playgroud)
不计算为NULL因为您传递一个空字符串而不是NULL作为参数TO_DATE()
这将成功评估为 NULL
SELECT TO_DATE(NULL,'yyyymmdd');
Run Code Online (Sandbox Code Playgroud)
如果您期望一个空字符串并希望将其视为NULL可以使用NULLIF()
SELECT TO_DATE(NULLIF(dt, ''),'yyyymmdd')
FROM
(
SELECT CAST('' AS VARCHAR(32)) dt
) q
Run Code Online (Sandbox Code Playgroud)
话虽如此,您的示例代码将 (1) 评估为 NULL
SELECT COALESCE(
TO_DATE(NULLIF('', ''),'yyyymmdd'), --(1)
TO_DATE(NULLIF('20130201',''),'yyyymmdd') --(2)
);
Run Code Online (Sandbox Code Playgroud)
并返回
| 联合 | --------------------- | 2013 年 2 月 1 日 00:00:00+0000 |
这是SQLFiddle演示
| 归档时间: |
|
| 查看次数: |
6199 次 |
| 最近记录: |