当列具有DATE约束时,将空字符串更改为NULL

时间:2019-05-22 13:28:10

标签: sql postgresql date insert create-table

这可能是不可能的,但我想知道是否有经验的人知道在Postgresql中是否可以这样做。

我的create语句中有一列

CREATE table IF NOT EXISTS (other cols, some_date DATE, other cols);

当我从API中提取json对象时,实际上可能有一个空字符串”而不是一个空单元格。当然哪个会给我以下错误psycopg2.errors.InvalidDatetimeFormat: invalid input syntax for type date: ""

该解决方案只是将约束更改为VARCHAR,但是我想知道CREATE TABLEINSERT语句中是否有某种方式可以说出以下伪代码:if empty string insert NULL

2 个答案:

答案 0 :(得分:1)

在您的INSERT语句中使用NULLIF

INSERT INTO your_table (cols..., some_date) VALUES (..., NULLIF(your_input_field, ''))

如果要查询的值是多个值中的任何一个,则要插入NULL,则使用CASE语句可能最简单:

INSERT INTO your_table (cols..., some_date)
VALUES (..., CASE WHEN your_input_field IN ('', '#', '-', '--', '??') THEN NULL ELSE your_input_field END)

如果更容易的话,也可以对数组做同样的事情:

INSERT INTO your_table (cols..., some_date)
VALUES (..., CASE WHEN your_input_field = ANY('{"",#,-,--,??}'::TEXT[]) THEN NULL ELSE your_input_field END)

答案 1 :(得分:0)

这是404发布的解决方案的一个示例,该解决方案检查我们试图在数据库中插入的内容是NITS(没什么好说的),然后将其替换为NULL

CREATE TABLE COMPANY(
   ID             VARCHAR,
   NAME           VARCHAR,
   AGE            VARCHAR,
   ADDRESS        VARCHAR,
   DATE           INTEGER
);

INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, DATE)
VALUES (CASE WHEN cast('a' as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE 'a' END,
        CASE WHEN cast('gino' as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE 'gino' END,
        CASE WHEN cast('' as text) IN ('', '#', '-', '--', '??', 'na') THEN NULL ELSE '' END,
        CASE WHEN cast('via figa' as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE 'via figa' END,
        CASE WHEN cast(1 as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE 1  END);