sql - Coalesce 和 Case-When with To_Date 没有按预期工作(Postgres 错误?)

标签 sql postgresql postgresql-9.1 to-date

我使用的是 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/

相关文章:

SQL存储动态数据

sql - PostgreSQL,检查相对于 "today"的日期

postgresql - 仅当外键不存在时如何创建外键?

postgresql-9.1 - postgresql中的移动平均过滤器

sql - 如何在 SELECT FOR XML 查询中选择返回的列名?

php - 使用 Yii 的 CDbCriteria 的比较方法与空字符串

Java 和 PostgreSQL 数组

postgresql - 序列的 pg_dump 设置

postgresql - 查找按关联排序的最后 n 个条目

postgresql - 如何在 postgresql 中将表约束更改为可延迟?