Если список условий не известен во время компиляции и вместо этого создается во время выполнения, Вы не должны волноваться о том, есть ли у Вас один или несколько, чем одно условие. Можно генерировать их всех как:
and <condition>
и связывают их всех вместе. С 1=1
в запуске, начальная буква and
имеет что-то для соединения с.
я никогда не видел используемый ни для какого вида инжекционной защиты, поскольку Вы говорите, что не кажется, что это помогло бы многому. Я имею замеченный, это использовало в качестве удобства реализации. Механизм SQL-запроса закончит тем, что игнорировал 1=1
, таким образом, он не должен будет оказывать влияние производительности.
Я сначала столкнулся с этой спиной с ADO и классическим asp, ответ, который я получил, был: производительность. , если Вы делаете прямое
Select * from tablename
и передача, что в как sql управляют/пишут, Вы получите значимое увеличение производительности с
Where 1=1
добавленный, это было видимое различие. что-то, чтобы сделать с заголовками таблицы, возвращаемыми, как только первое условие соблюдают, или некоторое другое сумасшествие, так или иначе, оно привело в порядок вещи скорости.
На самом деле я видел этот вид вещи, используемой в отчетах 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
и проверки:
, некоторые люди добавили бы первое с ГДЕ и последующие с И таким образом:
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
1 = 1 выражение является наиболее часто используемым в сгенерированном коде SQL. Это выражение может упростить sql, генерирующий количество сокращающего кода условных операторов.
Походит на ленивый способ всегда знать, что Ваш оператор Where уже определяется, и позвольте Вам продолжать добавлять условия, не имея необходимость проверять, является ли это первое.
Я видел, что это использовало, когда количество условий может быть переменным.
можно связать условия с помощью "И" строка. Затем вместо того, чтобы считать количество условий Вы являетесь передающими в, Вы помещаете, "ГДЕ 1=1" в конце Вашего SQL-оператора запаса и бросают на связанные условия.
В основном, это сохраняет Вас имеющий необходимость сделать тест для условий и затем добавить "ГДЕ" строка перед ними.
Просто добавив пример кода к ответу 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
где 1 = 0, это делается для проверки, существует ли таблица. Не знаю, почему используется 1 = 1.
Хотя я вижу, что 1=1 было бы полезно для сгенерированного SQL, метод, который я использую в PHP, заключается в создании массива условий, а затем делаю
implode (" AND ", $clauses);
, избегая таким образом проблемы с ведущим или трейлинговым AND. Очевидно, что это полезно только в том случае, если вы знаете, что у вас будет хотя бы одно условие!
.