PostgreSQL | Как проверить существование записи в таблице? — efim360.ru

PostgreSQL | Как проверить существование записи в таблице?

Для проверки существования записи в таблице PostgreSQL нужно использовать связку команды SELECT и команды EXISTS.

SELECT EXISTS (SELECT * FROM a.t_dname WHERE dname = 'efim360');

В этом примере мы хотим получить ЛОГИЧЕСКОЕ ЗНАЧЕНИЕ -  TRUE или FALSE.

Если в таблице t_dname существует запись со значением 'efim360' в столбце dname, то нам вернётся true. Это означает, что искомая нами запись существует в выбранной таблице. Мы использовали всего одно условие для поиска записи - для простоты примера.

 

Проверка существования записи в таблице по нескольким условиям в WHERE

Но иногда нужно использовать более одного условия, для проверки существования записи в таблице. Для решения таких задач нужно дополнительно использовать логические операторы: AND, OR

 

Использование в функции. Вставка если нет.

Такой способ очень помогает в написании функций с использованием условных конструкций IF THEN.

-- Вставка если нет

-- Проверка существования записи в таблице

-- Не повреждается автоинкремент первичного ключа

-- т. к. вставка осуществляется только при выполнении условия

 

CREATE OR REPLACE FUNCTION a.a4(str text)

RETURNS bigint

LANGUAGE 'plpgsql'

AS $$

    DECLARE pkey bigint;

    BEGIN

        IF NOT EXISTS (SELECT * FROM a.t_dname WHERE dname = str)

        THEN

            INSERT INTO a.t_dname (dname)

            VALUES (str)

            ON CONFLICT (dname)

            DO NOTHING

            RETURNING id INTO pkey;

            RETURN pkey;

        END IF;

        RETURN 0;

    END;

$$;

 

-- Получение всех данных из таблицы

SELECT * FROM a.t_dname;

SELECT * FROM a.t_dname WHERE dname = 'efim360'; -- есть в таблице

SELECT * FROM a.t_dname WHERE dname = '360'; -- нет в таблице

 

-- Проверка СУЩЕСТВОВАНИЯ или ОТСУТСТВИЯ записи в таблице прямым запросом в среду

SELECT EXISTS(SELECT * FROM a.t_dname WHERE dname = 'efim360');

SELECT EXISTS(SELECT * FROM a.t_dname WHERE dname = '360');

SELECT NOT EXISTS(SELECT * FROM a.t_dname WHERE dname = 'efim360');

SELECT NOT EXISTS(SELECT * FROM a.t_dname WHERE dname = '360');

 

-- Вызов функции с параметром

SELECT a.a4('efim360');

SELECT a.a4('ef');

SELECT a.a4('ef2');

 

-- Удаление функции

DROP FUNCTION a.a4(str text);

 

Выражение (SELECT * FROM a.t_dname WHERE dname = str) является подзапросом, который либо вернёт табличный результат, либо нет. Оно оборачивается круглыми скобками. Если слева от подзапроса будет написан оператор EXISTS, тогда мы получим логическое значение типа boolean. Если подзапрос вернёт какой-то табличный результат, тогда оператор EXISTS вернёт истину (true => t). Если подзапрос НЕ вернёт табличный результат, тогда оператор EXISTS вернёт ложь (false => f).

Если оператор EXISTS используется в сочетании с оператором NOT, тогда выражение "NOT EXISTS ()" вернёт противоположный результат от простого "EXISTS ()".

Выражение IF NOT EXISTS () применяется в функциях при объявлениях CREATE FUNCTION или в операторах DO. Оператор IF создаёт алгоритм ветвления, при котором максимально возможны два сценария событий. Если справа от IF окажется логическое true, тогда сценарий функции пойдёт по пути THEN. Если справа от IF окажется логическое false, тогда сценарий функции пойдёт по пути ELSE.

В нашем примере мы пытаемся сделать ВСТАВКУ данных в таблицу, если совпадение записи найдено - значит добавлять эту запись не нужно и мы вываливаемся из условия и идём дальше по телу функции и в конечном итоге попадаем в RETURN 0; Мы не добавляем то, что уже есть в базе. В этом нет смысла.

Если совпадение НЕ найдено, то его нужно добавить. Тогда false заменится на true и мы попадём в THEN и в нём выполним вставку.

Такой способ помогает нам НЕ ПРОПУСКАТЬ автоинкрементные ключи в таблице. Номер идентификатора автоинкремента будет идти последовательно т. к. не будет ложных срабатываний команды INSERT из-за возможных ограничений на уровне таблицы (например уникальность значений столбца).

 

Информационные ссылки

pgAdmin 4 | Первичный ключ автоинкремент

PostgreSQL | Функция проверки наличия пробелов в строке данных или строке запроса с клиента

Официальный сайт PostgreSQL - https://www.postgresql.org

Команды SQL - https://postgrespro.ru/docs/postgresql/14/sql-commands

Команда CREATE FUNCTION - https://postgrespro.ru/docs/postgresql/14/sql-createfunction

Команда SELECT - https://postgrespro.ru/docs/postgresql/14/sql-select

Раздел "9.23. Выражения подзапросов" - https://postgrespro.ru/docs/postgresql/14/functions-subquery

Команда EXISTS - https://postgrespro.ru/docs/postgresql/14/functions-subquery#FUNCTIONS-SUBQUERY-EXISTS

Графический интерфейс pgAdmin - https://www.pgadmin.org