Оператор «-» в SQL, где условие

Я столкнулся с довольно своеобразным синтаксисом в MySQL, а именно с наличием символа «-» в условии WHERE в следующем запросе.

SELECT 
    users.id
FROM
    users
WHERE
    users.account_status >= 3
        AND users.account_status NOT IN (8 , 9)
        AND - users.registration_status = 14
        AND users.id IN (229);

Я исследовал этот синтаксис в здесь?

Может ли это указывать на преобразование значения столбца «регистрационный_статус» в отрицательное число?

Да, это Измените знак оператора аргумента.

Álvaro González 05.04.2024 08:44

Это не «преобразование в отрицательное число», а смена знака. Т.е. если users.registrationstatus, например, -1, то - users.registration status будет +1

derpirscher 05.04.2024 08:46
.. AND - users.registration_status = 14 .. — плохая практика, это условие не подлежит SARG. Используйте .. AND users.registration_status = -14 ..демо
Akina 05.04.2024 08:48
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Да, он меняет знак user.registration_status перед сравнением его с 14 в вашем запросе.

Ответ принят как подходящий

Это унарный оператор минус . Следующие выражения эквивалентны:

  • - users.registration_status = 14
  • 0 - users.registration_status = 14
  • users.registration_status = -14

причем последнее, вероятно, является наиболее очевидным (ясность кода важна!)

Следующие выражения логически эквивалентны. Но есть разница на этапе выполнения, в вычислительной сложности и потреблении ресурсов. Последний вариант является предпочтительным.

Akina 05.04.2024 10:01

@Akina Я не проверял и не знаю деталей MySQL/MariaDB, но предполагаю, что оптимизатор запросов создает один и тот же план запроса для всех из них, поскольку они могут быть статически преобразованы в одно каноническое выражение.

knittl 05.04.2024 10:19

Я предполагаю, что оптимизатор запросов создает для всех один и тот же план запроса. Я привожу демонстрационную скрипту в комментарии к вопросу, где вы можете увидеть разницу в планах выполнения. Это верно как для MySQL, так и для MariaDB. Вы можете протестировать то же самое для других СУБД.

Akina 05.04.2024 10:50

Другие вопросы по теме