GOOGLE ADS

понедельник, 11 апреля 2022 г.

Как преобразовать пустое значение в null в PostgreSQL?

У меня есть несколько столбцов типа int, но значение пустое. Итак, я хочу преобразовать пустой в нуль при вставке в базу данных. Я использую код:

function toDB($string) {
if ($string == '' || $string == "''") {
return 'null';
} else {
return "'$string'";
}
}
//age,month,year is type integer.
$name="Veo ve";
$age='10';
$month='';
$year='';
$query="Insert Into tr_view(name,age,month,year) values ({toDB($name)},{toDB($age)},{toDB($month)},{toDB($year)})
$db->setQuery($query);
$result= $db->query();

Но он показывает ошибку:

 pg_query(): Query failed: ERROR: syntax error at or near ";" LINE 153: {toDB(10)}, ^ in...

Почему?


Решение проблемы

Есть NULLIF()функция:

SELECT NULLIF(var, '');

Если varравно второму параметру, NULLвместо этого вы получите.
В примере пустая строка заменяется ''на NULL.

Для типа integer нет "пустой строки". Оба параметра должны быть совместимого типа, поэтому дезинфицируйте свой ввод в PHP.

Если вы не определили столбец по умолчанию, вы также можете просто опустить столбец в INSERTкоманде, и он будет заполнен NULL(что является значением по умолчанию DEFAULT).

Проверьте, не пуст ли параметр в PHP, и не включайте столбец в INSERTкоманду, если это так.

Или вместо этого используйте PHP-литерал NULL, как показано здесь Quassnoi.

Остальное имеет смысл только для строковых типов

Чтобы быть абсолютно уверенным, что никто не может ввести пустую строку, добавьте CHECKв таблицу ограничение:

ALTER TABLE tr_view
ADD CONSTRAINT tr_view_age_not_empty CHECK (age <> '');

Чтобы избежать исключений, вызванных этим, вы можете добавить триггер, который автоматически исправляет ввод:

CREATE OR REPLACE FUNCTION trg_tr_view_avoid_empty()
RETURNS trigger
LANGUAGE plpgsql AS
$func$
BEGIN
IF NEW.age = '' THEN
NEW.age:= NULL;
END IF;
IF NEW.month = '' THEN
NEW.month:= NULL;
END IF;
RETURN NEW;
END
$func$;
CREATE TRIGGER tr_view_avoid_empty
BEFORE INSERT OR UPDATE ON tr_view
FOR EACH ROW
WHEN (NEW.age = '' OR NEW.month = '')
EXECUTE PROCEDURE trg_tr_view_avoid_empty();

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...