Измените пустую строку на NULL, когда столбец имеет ограничение DATE - PullRequest
0 голосов
/ 22 мая 2019

Это может быть невозможно, но мне было интересно, знает ли кто-то более опытный, возможно ли это сделать в postgresql.

В моем операторе создания есть столбец

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

Когда я извлекаю объект json из API, на самом деле может быть пустая строка '' вместо пустой ячейки. Что, конечно, дает мне следующую ошибку psycopg2.errors.InvalidDatetimeFormat: invalid input syntax for type date: ""

Решение было бы просто изменить ограничение на VARCHAR, но мне было интересно, есть ли какой-нибудь способ в операторах CREATE TABLE или INSERT сказать следующий псевдокод: if empty string insert NULL.

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Используйте NULLIF в своем выражении INSERT:

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)
0 голосов
/ 22 мая 2019

Вот пример решения, опубликованного 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);
...