Почему кто-то использовал бы ГДЕ 1=1 И <условия> в пункте SQL?

244
задан Sampson 16 November 2011 в 15:38
поделиться

9 ответов

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

and <condition>

и связывают их всех вместе. С 1=1 в запуске, начальная буква and имеет что-то для соединения с.

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

334
ответ дан Greg Hewgill 23 November 2019 в 03:07
поделиться

Я сначала столкнулся с этой спиной с ADO и классическим asp, ответ, который я получил, был: производительность. , если Вы делаете прямое

Select * from tablename

и передача, что в как sql управляют/пишут, Вы получите значимое увеличение производительности с

Where 1=1

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

-1
ответ дан jackberry 23 November 2019 в 03:07
поделиться

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

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

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

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

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

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

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

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

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

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

  • именем является Bob; и
  • зарплата> 20 000$

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

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

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

select * from t where 1=1 and name = 'Bob' and salary > 20000
11
ответ дан paxdiablo 23 November 2019 в 03:07
поделиться

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

16
ответ дан aku 23 November 2019 в 03:07
поделиться

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

27
ответ дан duckworth 23 November 2019 в 03:07
поделиться

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

можно связать условия с помощью "И" строка. Затем вместо того, чтобы считать количество условий Вы являетесь передающими в, Вы помещаете, "ГДЕ 1=1" в конце Вашего SQL-оператора запаса и бросают на связанные условия.

В основном, это сохраняет Вас имеющий необходимость сделать тест для условий и затем добавить "ГДЕ" строка перед ними.

37
ответ дан Carl 23 November 2019 в 03:07
поделиться

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

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
112
ответ дан Eduardo Molteni 23 November 2019 в 03:07
поделиться

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

11
ответ дан 23 November 2019 в 03:07
поделиться

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

implode (" AND ", $clauses);

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

.
6
ответ дан 23 November 2019 в 03:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: