在 Postgres 中插入 null 日期

inserting null date in postgres

提问人:caverac 提问时间:2/14/2023 更新时间:2/15/2023 访问量:383

问:

我在 sql 中插入带有语句的空日期INSERT ... SELECT FROM

CREATE TABLE null_date (
  id         bigserial PRIMARY KEY
, some_date  date
);

WITH date_data (some_date) AS (
  VALUES (null)
)
INSERT INTO null_date (some_date)
SELECT some_date
FROM date_data;

它失败了

ERROR:  column "some_date" is of type date but expression is of type text
LINE 5: SELECT some_date
               ^
HINT:  You will need to rewrite or cast the expression.

但是,如果我尝试直接插入它,它会起作用

INSERT INTO null_date (some_date)
VALUES (null)

有人可以帮我了解这里发生了什么吗?这是 db<>fiddle 的链接。谢谢

postgresql null sql-insert

评论

2赞 S-Man 2/14/2023
也许将其显式转换为类型日期?dbfiddle.uk/PDzMtTmg::date
2赞 Frank Heikens 2/14/2023
或者使用标准的 CAST() 来投射内容

答:

3赞 Laurenz Albe 2/14/2023 #1

问题是语句和子句会将 NULL 值视为 type ,因为PostgreSQL不知道NULL应该是什么数据类型。您没有这个问题,因为这里的 PostgreSQL 立即知道 TYPE 的 NULL 值将入到某个列中,因此它会将其解析为目标数据类型。VALUESWITHtextINSERT INTO ... VALUES (...)unknown

如果 PostgreSQL 无法从上下文中猜测数据类型,则最好使用显式类型转换:

WITH date_data (some_date) AS (
  VALUES (CAST(null AS date))
)
INSERT INTO null_date (some_date)
SELECT some_date
FROM date_data;

PostgreSQL 曾经在这种情况下表现不同,但提交 1e7c4bb0049 在 2017 年改变了这一点。阅读提交消息以获取说明。

评论

0赞 SQLpro 2/15/2023
这表明 PostGreSQL 不尊重 Codd 关于 NULL 的规则 3......“ 在完全关系的 DBMS 中,支持空值(不同于空字符串或空白字符串,不同于零或任何其他数字),以便以系统的方式表示缺失信息和不适用的信息,与数据类型无关。”
0赞 Laurenz Albe 2/15/2023
@SQLpro我知道这是纯粹的论战,所以我不会重复我试图与你进行以事实为中心的讨论的错误。我会把它留给读者来形成他们的意见。
0赞 SQLpro 2/15/2023
这不是争论。这是事实。PostGreSQL不尊重许多Codd规则的事实链接...