Какова цель использования WHERE 1 = 1 в операторах SQL?
Я видел это в разных примерах запросов, и это происходит, вероятно, во всех машинах SQL.
Если есть запрос, который не имеет определенных условий, люди (и, особенно, рамки ORM) часто добавляют всегда-истинное условие WHERE 1 = 1 или что-то в этом роде.
Единственная возможная причина, по которой я мог бы думать, если вы динамически добавляете условия, вам не нужно беспокоиться об удалении начального AND , но все же довольно часто это условие 1 = 1 лишается, если есть фактическое условие в запрос.
Фактический пример из CakePHP (сгенерированный фреймворком):
Есть ли причина для добавления этого дополнительного условия?
Это также обычная практика, когда люди строят sql-запрос программно, просто начать с «где 1 = 1», а затем добавить «и customer.id =: custId» в зависимости от того, предоставляется идентификатор клиента.
Поэтому вы всегда можете добавить следующую часть запроса, начиная с «и. «.
1 = 1 игнорируется всегда всеми rdbms. Нет компромисса, выполняющего запрос с ГДЕ 1 = 1.
Построение динамических условий WHERE, таких как рамки ORM или другие, очень часто, добавляет реальные условия там, где вы избегаете проверки наличия И для текущего условия.
когда пользователь выбирает «*» для параметра, используемого для col , изменяется следующим образом:
Это позволяет использовать новый запрос без использования функций позиционного параметра. Есть еще один такой параметр. Любая достойная СУБД (например, DB2/z) оптимизирует этот запрос, чтобы полностью удалить предложение полностью, прежде чем пытаться построить план выполнения, поэтому нет компромиссов.
Зачем использовать WHERE 1 или WHERE 1 = 1?
Обычно, если условия не требуются в наших операторах запроса, мы не используем WHERE предложение. Но я видел WHERE 1 пункт, который используется во многих местах, даже там, где другие условия отсутствуют.
- Почему это сделано?
- Есть ли конкретные преимущества для времени выполнения?
- Включает ли это другие функции?
- Использует ли WHERE 1=1 подобное подобное?
В основном это просто для удобства программиста, так как вы можете просто добавить дополнительные условия AND. после этого, и это не повлияет на время выполнения.
Проверьте эти ссылки на Stackoverflow:
Обратите внимание, что WHERE 1 идентично WHERE 1=1 ; оба означают, WHERE TRUE но первое отклонено многими системами управления базами данных как не действительно логическое.
Мое основное использование заключается в том, что это облегчает комментирование материала при разработке запросов. Я веду с , ‘s и and ‘ s:
Также облегчает программную привязку до конца.
В противном случае вам нужно будет квалифицировать первый вариант . и каждый следующий параметр проверяет предыдущие параметры. Что если пользователь выбрал только вариант D в предыдущем примере? Вы должны убедиться, что if A, B and C aren’t chosen затем использовать WHERE другое использование and . С = самого начала вы можете просто добавить классификаторы к концу оператора.
Мне приходит в голову динамическая генерация кода, написанная не слишком компетентными программистами.
Генерирует SELECT . WHERE, а затем вам нужно иметь что-то . поэтому вместо добавления WHERE только при необходимости они добавляют неограничивающие условия, когда их нет. Видно, что — ответственный за увольнение «специалист».
Или у парня просто вещи ГДЕ обязательны;)
Что-то еще я не вижу.
Я программировал набор пользовательских функций на C ++ / C для PostgreSQL, которые использовались другими людьми в большой компании (более 10 тысяч человек). Мои функции имеют необязательный where параметр: если значение не указано, предложение не используется. Это было явно задокументировано. К сожалению, никто не использовал эту функцию, и все, кто просто поставил where 1=1 предложение. Теоретически это кажется неразумным, практически все оптимизаторы запросов исключают подобные утверждения. И трудно обучать 10 тысяч человек.
Использование «где 1 = 1» уменьшает сложность кода, необходимого для динамического создания предложения sql ‘where’. В противном случае при создании предложения where вам нужно будет проверить, является ли это первым компонентом для каждого добавленного компонента. Это простой кодовый шаблон, позволяющий снизить сложность кода и, по возможности, уменьшить сложность кода — это почти всегда правильное решение.
Здесь вы идете . с точки зрения программирования одно использование 1 = 1 . 
В такой ситуации, когда мне нужно построить запрос во время выполнения, и он может быть коротким или длинным, я использую «где 1 = 1 И»
Зачем кому-то использовать WHERE 1 = 1 AND <conditions> в предложении SQL?
Я где-то видел, что это будет использоваться для защиты от SQL-инъекций, но это кажется очень странным.
Если есть инъекция, WHERE 1 = 1 AND injected OR 1=1 будет иметь тот же результат, что и injected OR 1=1 .
Позднее редактирование: как насчет использования в определении представления?
Спасибо за ваши ответы.
По-прежнему, Я не понимаю, зачем кому-то использовать эту конструкцию для определения представления или использовать ее внутри хранимой процедуры.
Возьмем, к примеру:



Ответы 20
Если список условий неизвестен во время компиляции и вместо этого создается во время выполнения, вам не нужно беспокоиться о том, есть ли у вас одно или несколько условий. Вы можете сгенерировать их все, например:
и соедините их все вместе. С 1=1 вначале, у первоначального and есть что связать.
Я никогда не видел, чтобы это использовалось для какой-либо защиты от инъекций, как вы говорите, похоже, что это не сильно поможет. Я видел, что имеют используется для удобства реализации. Механизм запросов SQL в конечном итоге проигнорирует 1=1 , поэтому это не должно повлиять на производительность.
В прошлом были случаи, когда SQL Server создавал плохие планы при использовании этого метода. По этой причине я больше не использую его, если только запрос не нацелен на получение определения схемы.
Согласовано. Проголосуйте за ответ на вопрос, но я бы рекомендовал для начала правильно написать запрос, а не лениться.
Иногда речь идет не о лени, а о более чистом коде.
работа с конечными операторами AND или COMMA не является грязной . нет ничего более чистого, если 1 = 1 во всем вашем SQL.
Да, если бы наши администраторы баз данных увидели этот запрос в их коллекциях статистики RUNSTATS, они бы выследили вас, как утку (и прежде, чем кто-нибудь спросит, это на самом деле юмористическая строчка из фильмов «Назад в будущее»).
DBA? Для чего они? 🙂
Администраторы баз данных должны помочь программистам, которые думают, что знают, как эффективно использовать базы данных.
Одно место, где этот метод очень полезен, — это инструменты бизнес-аналитики, которые позволяют размещать «условные подсказки» в SQL, такие как Microstrategy.
Я сторонник любого пути, и если кто-то сможет улучшить производительность, тем лучше. Я просто хотел указать, что создание массива условий (хранящихся в виде строк) с последующим объединением их с помощью «и» может быть такой же ленивой альтернативой подходу 1 = 1.
Может ли шаблон WHERE 1 AND <conditions> каким-либо образом вводить гигантские дыры в безопасности через внедрение sql по сравнению с WHERE <condition 1> AND <conditions 2+> ? Мой начальник говорит мне, что он вводит sql-инъекцию, это ужасно, и этого не следует делать. Они тоже не могут мне привести никаких примеров. Они сумасшедшие и принимают это за инъекцию OR 1=1 ?
@radtek: Нет, SQL-инъекция не имеет ничего общего с фактически используемыми операторами SQL. Все дело в как, в котором вызываются операторы SQL.
Я так и подумал, я не вижу в этом никаких дыр в безопасности. В обоих случаях, если функция, генерирующая SQL, не допускает никаких условий, мы выбираем все в этой таблице.
и не должен ли план выполнения быть таким же, с условием или без него? Так что я не вижу вреда в использовании этого; он позволяет сделать код более чистым, и выполнение остается таким же.
Как насчет того, чтобы поставить 1 = 1 в конце и использовать <condition> AND ? Разве это не решило бы проблему плохого плана запроса? Не удивлюсь, если первые условия окажут большее влияние, чем последующие .
В SQL Server это не приводит к снижению производительности благодаря функции Constant Folding and Expression Evaluation (docs.microsoft.com/en-us/sql/relational-databases/…).
Похоже на ленивый способ всегда знать, что ваше предложение WHERE уже определено и позволяет вам продолжать добавлять условия, не проверяя, является ли оно первым.
@ADTC Написание кода часто — если не в основном — связано с обработкой различных условий. Это просто еще одно условие, которое необходимо обработать, и я лично считаю, что лень загрязнять сгенерированный SQL. Если вы спроектируете свой код так, чтобы добавить «Где 1 = 1» в ОДНОМ месте, вы могли бы — с небольшими дополнительными усилиями — обработать разницу между нулем и многими условиями в этом ОДНОМ месте кода. Я предполагаю, однако, что сторонники «Где 1 = 1» разбрасывают его по всей своей кодовой базе, что подводит меня к выводу, что лень порождает лень.
@JasonS Лень — отец изобретений.
@ADTC Я ленив, потому что не люблю обновлять код в сотнях мест, поэтому изобретение помещает его в одно место. Для меня WHERE 1=1 порождает дополнительную работу по поддержанию одного и того же кода в нескольких местах и чтению его во всех сгенерированных вами SQL. Я думаю, что я ленивее тебя!
Выражение 1 = 1 обычно используется в сгенерированном коде sql. Это выражение может упростить создание кода sql, уменьшив количество условных операторов.
Я видел, как он используется, когда количество условий может быть переменным.
Вы можете объединить условия, используя строку «И». Затем вместо подсчета количества условий, которые вы передаете, вы помещаете «WHERE 1 = 1» в конец стандартного оператора SQL и добавляете конкатенированные условия.
По сути, это избавляет вас от необходимости выполнять проверку условий и затем добавлять перед ними строку «WHERE».
Просто добавив пример кода к ответу Грега:
немного хакерский, но похоже на допустимое использование.
Это должен быть принятый ответ. На самом деле практика сводится только к тому, чтобы не определять, сколько у вас условных операторов.
На самом деле, я видел такие вещи, используемые в отчетах BIRT. Запрос, переданный среде выполнения BIRT, имеет форму:
и ‘?’ заменяется во время выполнения фактическим значением параметра, выбранным из раскрывающегося списка. Варианты выбора в раскрывающемся списке представлены:
так что вы получите все возможные значения плюс » * «. Если пользователь выбирает « * » из раскрывающегося списка (это означает, что должны быть выбраны все значения a), запрос должен быть изменен (с помощью Javascript) перед запуском.
Поскольку «?» является позиционным параметром и ДОЛЖЕН оставаться там для работы других вещей, Javascript изменяет запрос следующим образом:
Это в основном устраняет эффект предложения where, оставляя при этом позиционный параметр на месте.
Я также видел случай AND, используемый ленивыми кодировщиками при динамическом создании SQL-запроса.
Допустим, вам нужно динамически создать запрос, который начинается с select * from t и проверяет:
- зовут Боб; и
- зарплата> 20000 долларов
некоторые люди добавляли бы первые с помощью WHERE, а последующие с помощью AND, таким образом:
Ленивые программисты (и это не обязательно признак плохой) не будут различать добавленные условия, они начнут с select * from t where 1=1 и просто добавят после этого предложения AND.
@ADTC, я не имел в виду ленивый в плохом смысле. Фактически, ленивость — это черта хорошо в программировании 🙂 Я поясню.