Каков порядок сравнения данных в базе данных для SELECT по столбцу A ИЛИ столбцу B

0

У меня есть запрос, где мне нужно получить строку на 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]')
Теги:
select
order
comparison

1 ответ

1
Лучший ответ

Предложение 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' дважды... Лучше думать более на основе набора.

  1. Поиск записей с адресами электронной почты X или Y
  2. Сортируйте их так, чтобы записи с адресом электронной почты X были первыми
  3. Выберите только первую запись

Например...

SELECT
  *
FROM
  champions
WHERE
  email IN ('[email protected]', '[email protected]')
ORDER BY
  CASE WHEN email = '[email protected]' THEN 1 ELSE 2 END
LIMIT
  1
  • 0
    Спасибо @MatBailie, точно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню