PL/pgSQL проверка наличия строки
Я пишу функцию в PL/pgSQL, и я ищу самый простой способ проверить, существует ли строка.
Прямо сейчас я выбираю integer
в boolean
, который на самом деле не работает. У меня недостаточно опыта работы с PL/pgSQL, чтобы знать, как это сделать.
Вот часть моей функции:
DECLARE person_exists boolean;
BEGIN
person_exists := FALSE;
SELECT "person_id" INTO person_exists
FROM "people" p
WHERE p.person_id = my_person_id
LIMIT 1;
IF person_exists THEN
-- Do something
END IF;
END; $$ LANGUAGE plpgsql;
Обновление - я делаю что-то вроде этого сейчас:
DECLARE person_exists integer;
BEGIN
person_exists := 0;
SELECT count("person_id") INTO person_exists
FROM "people" p
WHERE p.person_id = my_person_id
LIMIT 1;
IF person_exists < 1 THEN
-- Do something
END IF;
2 ответа
Проще, короче, быстрее: EXISTS
,
IF EXISTS (SELECT 1 FROM people WHERE person_id = my_person_id) THEN
-- do something
END IF;
Планировщик запросов может остановиться на первой найденной строке - в отличие от count()
, который будет сканировать все соответствующие строки независимо. Имеет значение с большими столами. Вряд ли имеет значение условие для уникального столбца - в любом случае квалифицируется только одна строка (и есть индекс для быстрого поиска).
Улучшено с помощью ввода @a_horse_with_no_name в комментариях ниже.
Вы могли бы даже использовать пустой SELECT
список:
IF EXISTS (SELECT FROM people WHERE person_id = my_person_id) THEN ...
Так как SELECT
список не имеет отношения к исходу EXISTS
, Имеет значение только наличие хотя бы одного квалификационного ряда.
Используйте счет (*)
declare
cnt integer;
begin
SELECT count(*) INTO cnt
FROM people
WHERE person_id = my_person_id;
IF cnt > 0 THEN
-- Do something
END IF;
Изменить (для downvoter, который не читал заявление и других, которые могут делать что-то подобное)
Решение эффективно только потому, что в столбце есть предложение where (а имя столбца предполагает, что он является первичным ключом, поэтому предложение where очень эффективно).
Из-за этого where
В предложении нет необходимости использовать LIMIT или что-то еще для проверки наличия строки, идентифицируемой ее первичным ключом. Это эффективный способ проверить это.