Подтвердить что ты не робот

Проверка 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;
4b9b3361

Ответ 1

Проще, короче, быстрее: EXISTS.

IF EXISTS (SELECT 1 FROM people p WHERE p.person_id = my_person_id) THEN
  -- do something
END IF;

Планировщик запросов может остановиться на первой найденной строке - в отличие от count(), который будет сканировать все соответствующие строки независимо. Имеет значение с большими столами. Вряд ли имеет значение условие для уникального столбца - в любом случае только одна строка соответствует требованиям (и есть индекс для быстрого поиска).

Improved with input from @a_horse_with_no_name in the comments below.

Вы даже можете использовать пустой список SELECT:

IF EXISTS (SELECT FROM people p WHERE p.person_id = my_person_id) THEN ...

Поскольку список SELECT не имеет отношения к результатам EXISTS. Имеет значение только наличие хотя бы одного квалификационного ряда.

Ответ 2

Использовать счетчик (*)

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 или что-то еще, чтобы проверить наличие строки, которая идентифицируется ее основным ключом. Он - эффективный способ проверить это.