Измените пустую строку на NULL, если столбец имеет ограничение DATE

Это может быть невозможно, но мне было интересно, знает ли кто-нибудь более опытный, возможно ли это сделать в 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.

Если ничего не помогает, вы можете импортировать в промежуточную таблицу, а затем вставить оттуда с помощью case на вставке.

JohnHC 22.05.2019 15:41
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
1
2 613
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте 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)

Спасибо! your_input_field следует заменить на some_date?

Tytire Recubans 22.05.2019 15:52
your_input_field — это значение поля JSON, которое вы хотите вставить в поле some_date в вашей таблице, которое может быть пустой строкой. Выполнение NULLIF значения вернет NULL, если значение первого параметра равно значению второго параметра. Дайте мне знать, если я неправильно понял ваш вопрос.
404 22.05.2019 15:54

Джекпот был бы, если бы я мог вставить NULL для списка таких строк, как #---?? и т. д. ... так называемые NITS (ничего интересного).

Tytire Recubans 22.05.2019 16:11

Святое дерьмо, ты мне так помог!! Тысяча благодарностей ))

Tytire Recubans 22.05.2019 16:21

Рад помочь! :)

404 22.05.2019 16:23

Я не хочу просить слишком многого, но я пытаюсь преобразовать это в команду psycopg2, но это не работает, см.: stackoverflow.com/questions/56260366/…

Tytire Recubans 22.05.2019 20:58

@TytireRecubans Я опубликовал ответ на этот вопрос, посмотрите, сработает ли он для вас.

404 23.05.2019 00:03

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

Другие вопросы по теме