Зачем кому-то использовать WHERE 1 = 1 и <conditions>в предложении SQL? - PullRequest
231 голосов
/ 28 октября 2008

Зачем кому-то использовать WHERE 1=1 AND <conditions> в предложении SQL (либо SQL, полученный через объединенные строки, либо определение определения)

Я где-то видел, что это будет использоваться для защиты от SQL-инъекций, но это кажется очень странным.

Если есть инъекция, WHERE 1 = 1 AND injected OR 1=1 будет иметь тот же результат, что и injected OR 1=1.

Позднее редактирование: как насчет использования в определении представления?


Спасибо за ваши ответы.

Тем не менее, Я не понимаю, почему кто-то использует эту конструкцию для определения представления или использует ее внутри хранимой процедуры.

Возьмем для примера:

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 AND table.Field=Value

Ответы [ 18 ]

320 голосов
/ 28 октября 2008

Если список условий неизвестен во время компиляции и вместо этого создается во время выполнения, вам не нужно беспокоиться о наличии одного или нескольких условий. Вы можете генерировать их все как:

and <condition>

и объединить их все вместе. С 1=1 в начале у начального and есть что связать.

Я никогда не видел, чтобы это использовалось для какой-либо защиты от инъекций, поскольку вы говорите, что это не очень помогает. Я видел , что используется для удобства реализации. Механизм SQL-запросов в конечном итоге проигнорирует 1=1, поэтому он не должен влиять на производительность.

111 голосов
/ 28 октября 2008

Просто добавьте пример кода к ответу Грега:

dim sqlstmt as new StringBuilder
sqlstmt.add("SELECT * FROM Products")
sqlstmt.add(" WHERE 1=1") 

''// From now on you don't have to worry if you must 
''// append AND or WHERE because you know the WHERE is there
If ProductCategoryID <> 0 then
  sqlstmt.AppendFormat(" AND ProductCategoryID = {0}", trim(ProductCategoryID))
end if
If MinimunPrice > 0 then
  sqlstmt.AppendFormat(" AND Price >= {0}", trim(MinimunPrice))
end if
35 голосов
/ 28 октября 2008

Я видел это, когда число условий может быть переменным.

Вы можете объединять условия, используя строку «И». Затем, вместо подсчета количества условий, которые вы передаете, вы помещаете «WHERE 1 = 1» в конце своего оператора SQL и добавляете объединенные условия.

По сути, это избавляет вас от необходимости проверять условия, а затем добавлять строку «ГДЕ» перед ними.

25 голосов
/ 28 октября 2008

Похоже, ленивый способ всегда знать, что ваше предложение WHERE уже определено и позволяет вам продолжать добавлять условия, не проверяя, является ли оно первым.

15 голосов
/ 20 февраля 2013

Косвенно релевантно: когда используется 1 = 2:

CREATE TABLE New_table_name 
as 
select * 
FROM Old_table_name 
WHERE 1 = 2;

это создаст новую таблицу с той же схемой, что и старая таблица. (Очень удобно, если вы хотите загрузить некоторые данные для сравнения)

14 голосов
/ 28 октября 2008

1 = 1 выражение обычно используется в сгенерированном коде sql. Это выражение может упростить создание кода SQL, уменьшая количество условных операторов.

10 голосов
/ 14 сентября 2009

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

10 голосов
/ 28 октября 2008

На самом деле, я видел подобные вещи, используемые в отчетах BIRT. Запрос, передаваемый в среду выполнения BIRT, имеет вид:

select a,b,c from t where a = ?

и "?" во время выполнения заменяется фактическим значением параметра, выбранным из раскрывающегося списка. Выбор в раскрывающемся списке:

select distinct a from t
union all
select '*' from sysibm.sysdummy1

, чтобы вы получили все возможные значения плюс "*". Если пользователь выбирает «*» из выпадающего списка (то есть все значения a должны быть выбраны), запрос должен быть изменен (с помощью Javascript) перед выполнением.

С "?" является позиционным параметром, и ДОЛЖЕН оставаться там, чтобы другие вещи работали, Javascript изменяет запрос так:

select a,b,c from t where ((a = ?) or (1==1))

Это в основном устраняет эффект предложения where, в то же время оставляя позиционный параметр на месте.

Я также видел случай AND, используемый ленивыми кодировщиками при динамическом создании SQL-запроса.

Допустим, вам нужно динамически создать запрос, который начинается с select * from t и проверяет:

  • зовут Боб; и
  • оклад> 20 000 долларов

некоторые люди добавили бы первое с ГДЕ, а последующие с И, таким образом:

select * from t where name = 'Bob' and salary > 20000

Ленивые программисты (и это не обязательно плохая черта) не будут различать добавленные условия, они начнут с select * from t where 1=1 и просто добавят предложения AND после этого.

select * from t where 1=1 and name = 'Bob' and salary > 20000
7 голосов
/ 19 мая 2016

Я нашел эту модель полезной, когда я тестирую или перепроверяю вещи в базе данных, поэтому я могу очень быстро комментировать другие условия:

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 
AND Table.Field=Value
AND Table.IsValid=true

превращается в:

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 
--AND Table.Field=Value
--AND Table.IsValid=true
5 голосов
/ 07 января 2010

Хотя я вижу, что 1 = 1 было бы полезно для сгенерированного SQL, метод, который я использую в PHP, - это создать массив предложений и затем выполнить

implode (" AND ", $clauses);

, таким образом, избегая проблемы наличия ведущего или конечного И. Очевидно, что это полезно, только если вы знаете, что у вас будет хотя бы одно предложение!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...