【问题标题】:Change empty string to NULL when column has DATE constraint当列具有 DATE 约束时,将空字符串更改为 NULL
【发布时间】:2019-05-22 13:28:10
【问题描述】:

这可能是不可能的,但我想知道是否有更有经验的人知道这是否可以在 postgresql 中完成。

我的创建语句中有一个列

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

【问题讨论】:

  • 如果所有其他方法都失败了,您可以导入临时表,然后从那里插入并在插入时添加 case

标签: sql postgresql date insert create-table


【解决方案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)

【讨论】:

  • 谢谢! your_input_field 应该替换为 some_date?
  • your_input_field 是您要在表中的 some_date 字段中插入的 JSON 字段值,可以是空字符串。如果第一个参数的值等于第二个参数的值,则对该值执行NULLIF 将返回 NULL。如果我误解了您的问题,请告诉我。
  • 如果我可以插入一个NULL 来获取# - -- -- ?? 等字符串列表,那么大奖将是……所谓的 NITS(对说)。
  • 很高兴为您提供帮助! :)
  • @TytireRecubans 我已经发布了关于这个问题的答案,看看是否适合你。
【解决方案2】:

这是 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多