Проверка наличия адресов email в таблице SQL: существует или нет
Быстрый ответ
Для определения отсутствующих записей в SQL-таблице из заданного списка воспользуйтесь LEFT JOIN совместно с VALUES. Фильтруйте NULL значения для получения результатов.
WITH List(Value) AS (VALUES ('A'),('B'),('C'))
SELECT List.Value
FROM List
LEFT JOIN YourTable ON List.Value = YourTable.Column
WHERE YourTable.Column IS NULL;
Замените 'A', 'B', 'C'
на нужные вам значения и скорректируйте YourTable
и Column
. Этот подход позволяет быстро выявить недостающие элементы.
Продвинутый подход с использованием оператора EXCEPT
Оператор EXCEPT служит для выявления отсутствующих значений. Он выберет записи из первого запроса, которых нет в результате второго запроса.
SELECT Value
FROM (VALUES ('A'), ('B'), ('C')) AS List(Value)
EXCEPT
SELECT Column
FROM YourTable;
Совместимость с более старыми версиями SQL Server
При работе со старыми версиями SQL Server вы можете воспользоваться подходом с использованием производной таблицы и UNION ALL:
SELECT Value
FROM (
SELECT 'A' AS Value
UNION ALL
SELECT 'B'
UNION ALL
SELECT 'C'
) AS List
LEFT JOIN YourTable ON List.Value = YourTable.Column
WHERE YourTable.Column IS NULL;
Применение NOT IN и EXISTS
Помимо LEFT JOIN, можно использовать NOT IN или подзапросы с EXISTS:
-- Подход с NOT IN
SELECT Value
FROM (VALUES ('A'), ('B'), ('C')) AS List(Value)
WHERE Value NOT IN (SELECT Column FROM YourTable)
-- Подзапрос EXISTS с условием CASE
SELECT Value,
CASE WHEN EXISTS(SELECT 1 FROM YourTable WHERE Column = List.Value)
THEN 'Exists' ELSE 'Missing' END AS Status
FROM (VALUES ('A'), ('B'), ('C')) AS List(Value)
Использование общих табличных выражений (CTE)
CTE (Common Table Expression) используют для упорядочивания данных и повышения читаемости запросов:
WITH EmailList AS (
SELECT 'email1@example.com' AS Email
UNION ALL SELECT 'email2@example.com'
UNION ALL SELECT 'email3@example.com'
)
SELECT Email,
CASE WHEN yt.Email IS NULL THEN 'Missing' ELSE 'Exists' END AS Status
FROM EmailList el
LEFT JOIN YourEmailTable yt
ON el.Email = yt.Email;
Визуализация
Поиск сокровищ можно представить так:
Список значений (🗺️): [💎, 🏺, 📜, 🗡️]
Таблица (🏰): [🗡️, 📜]
Отсутствуют в замке (❓): [💎, 🏺]
Спрятанные сокровища вы можете открыть при помощи SQL:
SELECT treasure
FROM ValueList
WHERE treasure NOT IN (SELECT treasure FROM Castle)
Таким образом, мы находим потерянные сокровища, обойдя охрану замка:
🗺️➖🏰 = [💎, 🏺]
// Сокровища ждут своего обнаружения!
Полезные материалы
- Конструктор значений таблиц (Transact-SQL) – SQL Server | Microsoft Learn – Изучение конструкторов значений таблиц даст вам способность к волшебству в SQL.
- SQL Server LEFT JOIN Not IN – SQL Authority – Обоснование, почему предпочтительнее использовать LEFT JOIN, чем NOT IN.
- LEFT Anti Semi Join – SQL Performance – Анализ производительности запросов при использовании NOT EXISTS и NOT IN.