У меня есть запрос, где мне нужно получить строку на 1), сравнивая по old_email, а если не найден, то 2), сравнивая столбец электронной почты. Мне нужно убедиться, что первая проверка всегда по старому электронному письму, а вторая проверка - по новому электронному письму, если старый не был найден.
Я знаю, что я не могу использовать set, потому что порядок сравнения не гарантируется, например
SELECT * FROM champions WHERE (email IN ('[email protected]', '[email protected]'))
Будет ли следующий код удовлетворять мои потребности:
SELECT * FROM champions WHERE (email = '[email protected]' OR email = '[email protected]')
Предложение WHERE
применяется последовательно за строкой. Результат из одной строки не знает результата из другой строки.
То, что вы, кажется, описываете, - "искать адрес электронной почты X, если не найден, найдите адрес электронной почты Y".
Есть несколько способов сделать это. Ниже, например, очень буквальный подход к тому, что вы описали...
SELECT
*
FROM
champions
WHERE
email = '[email protected]'
UNION ALL
SELECT
*
FROM
champions
WHERE
email = '[email protected]'
AND NOT EXISTS (SELECT * FROM champions WHERE email = '[email protected]')
Это буквально то, что вы описали. Найдите адрес электронной почты X. Также найдите адрес электронной почты Y, при условии, что адрес электронной почты X отсутствует.
Это довольно многословно, однако, вы в конечном итоге проверяете 'X'
дважды... Лучше думать более на основе набора.
Например...
SELECT
*
FROM
champions
WHERE
email IN ('[email protected]', '[email protected]')
ORDER BY
CASE WHEN email = '[email protected]' THEN 1 ELSE 2 END
LIMIT
1