postgresql 在postgres中插入空日期

but5z9lq  于 2023-02-15  发布在  PostgreSQL
关注(0)|答案(1)|浏览(335)

我在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的链接。谢谢

7jmck4yq

7jmck4yq1#

问题是VALUES语句和WITH子句会将NULL值作为text类型处理,因为PostgreSQL不知道NULL值应该是哪种数据类型,而INSERT INTO ... VALUES (...)就没有这个问题,因为PostgreSQL知道unknown类型的NULL值会被插入到某个列中。因此它会将其解析为目标数据类型。
在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过去在这种情况下的行为有所不同,但commit 1e7c4bb0049在2017年改变了这一点。阅读提交消息以了解解释。

相关问题