提问人:caverac 提问时间:2/14/2023 更新时间:2/15/2023 访问量:383
在 Postgres 中插入 null 日期
inserting null date in postgres
问:
我在 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 的链接。谢谢
答:
3赞
Laurenz Albe
2/14/2023
#1
问题是语句和子句会将 NULL 值视为 type ,因为PostgreSQL不知道NULL应该是什么数据类型。您没有这个问题,因为这里的 PostgreSQL 立即知道 TYPE 的 NULL 值将入到某个列中,因此它会将其解析为目标数据类型。VALUES
WITH
text
INSERT 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规则的事实链接...
评论
::date