当列具有 DATE 约束时,将空字符串更改为 NULL
Change empty string to NULL when column has DATE constraint
这可能是不可能的,但我想知道是否有更有经验的人知道这在 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 TABLE
或 INSERT
语句中是否有某种方法可以说出以下伪代码:if empty string insert NULL
.
在您的 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)
这是 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);
这可能是不可能的,但我想知道是否有更有经验的人知道这在 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 TABLE
或 INSERT
语句中是否有某种方法可以说出以下伪代码:if empty string insert NULL
.
在您的 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)
这是 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);