"где 1 = 1"
Возможный дубликат:
Почему кто-то использует WHERE 1 = 1 AND <conditions> в предложении SQL?
Я видел, как некоторые люди использовали оператор для запроса таблицы в базе данных MySQL, как показано ниже:
select * from car_table where 1=1 and value="TOYOTA"
Но что означает 1=1
?
Ответы
Ответ 1
Обычно, когда люди создают инструкции SQL.
Когда вы добавляете and value = "Toyota"
, вам не нужно беспокоиться о том, есть ли условие раньше или просто ГДЕ. Оптимизатор должен игнорировать его
Без магии, просто практично
Пример кода:
commandText = "select * from car_table where 1=1";
if (modelYear <> 0) commandText += " and year="+modelYear
if (manufacturer <> "") commandText += " and value="+QuotedStr(manufacturer)
if (color <> "") commandText += " and color="+QuotedStr(color)
if (california) commandText += " and hasCatalytic=1"
В противном случае вам придется иметь сложный набор логик:
commandText = "select * from car_table"
whereClause = "";
if (modelYear <> 0)
{
if (whereClause <> "")
whereClause = whereClause + " and ";
commandText += "year="+modelYear;
}
if (manufacturer <> "")
{
if (whereClause <> "")
whereClause = whereClause + " and ";
commandText += "value="+QuotedStr(manufacturer)
}
if (color <> "")
{
if (whereClause <> "")
whereClause = whereClause + " and ";
commandText += "color="+QuotedStr(color)
}
if (california)
{
if (whereClause <> "")
whereClause = whereClause + " and ";
commandText += "hasCatalytic=1"
}
if (whereClause <> "")
commandText = commandText + "WHERE "+whereClause;
Ответ 2
Если этот запрос строится динамически, оригинальный автор, вероятно, не хочет рассматривать пустой набор условий, поэтому заканчивается примерно так:
sql = "select * from car_table where 1=1"
for each condition in condition_set
sql = sql + " and " + condition.field + " = " + condition.value
end
Ответ 3
1=1
всегда будет истинным, поэтому бит value="TOYOTA"
является важным.
Вы получаете это в нескольких сценариях, включая:
Сгенерированный SQL: проще создать сгенерированный сложный оператор where
, если вам не нужно работать, если вы добавляете первое условие или нет, поэтому часто ставится 1=1
в начале, и все остальные условия могут быть добавлены с помощью And
Отладка: иногда вы видите, что люди помещают 1=1
в верхнюю часть условия where, поскольку он позволяет им свободно нарезать и изменять остальные условия при отладке запроса. например.
select * from car_table
where 1=1
--and value="TOYOTA"
AND color="BLUE"
--AND wheels=4
Следует сказать, что это не особенно хорошая практика и обычно не должно происходить в производственном коде. Это может даже не помочь оптимизировать запрос.
Ответ 4
Как и все другие ответы, это простой метод для атак SQL-инъекций. Если вы добавите инструкцию OR where 1=1
к некоторому SQL, тогда она вернет все результаты из-за присущей правдоподобности выражения.
Ответ 5
Его просто всегда истинное выражение. Некоторые люди используют это как обход.
У них есть статический оператор вроде:
select * from car_table where 1=1
Итак, теперь они могут добавить что-то в предложение where с помощью
and someother filter
Ответ 6
1 = 1, где условие всегда истинно, потому что всегда 1 равно 1, поэтому это утверждение всегда будет истинным.
Хотя иногда это ничего не значит. но в других случаях разработчики используют это, когда условие where генерируется динамически.
например, см. этот код
<?php
//not that this is just example
//do not use it like that in real environment because it security issue.
$cond = $_REQUEST['cond'];
if ($cond == "age"){
$wherecond = " age > 18";
}
$query = "select * from some_table where $wherecond";
?>
поэтому в приведенном выше примере, если $_ REQUEST ['cond'] не " age", запрос возвращает mysql-ошибку, потому что после условия where нет ничего,
запрос будет выбрать * из some_table, где, и это ошибка
чтобы исправить эту проблему (по крайней мере, в этом небезопасном примере), мы используем
<?php
//not that this is just example
//do not use it like that in real environment because it security issue.
$cond = $_REQUEST['cond'];
if ($cond == "age"){
$wherecond = " age > 18";
} else {
$wherecond = " 1=1";
}
$query = "select * from some_table where $wherecond";
?>
Итак, теперь, если $_ REQUEST ['cond'] не age, $wherecond будет 1 = 1, поэтому запрос не будет иметь возврат ошибки mysql.
запрос будет выбрать * из some_table, где 1 = 1, и чтобы избежать ошибки mysql
надеюсь, что вы поймете, когда мы используем 1 = 1, но обратите внимание, что приведенный выше пример не является примером реального мира, и он просто должен показать вам эту идею.
Ответ 7
Большинство разработчиков времени используют этот тип запроса, если он разрабатывает приложение типа построителя запроса или создает сложный SQL-запрос, поэтому вместе с строкой оператора select добавьте условное предложение Где 1 = 1, а в программе нет необходимости добавлять любая проверка для него.
Ответ 8
Запрос находит все строки, для которых 1 равно 1, а значение равно "TOYOTA". Поэтому в этом случае это бесполезно, но если вы опускаете инструкцию WHERE, может быть хорошей идеей использовать WHERE 1 = 1, чтобы напомнить вам, что вы выбрали НЕ использовать предложение WHERE.
Ответ 9
использование этого происходит в сложных запросах при динамическом прохождении условий, вы можете конкатенировать условия с помощью строки "AND". Затем, вместо подсчета количества условий, в которых вы проходите, вы помещаете "WHERE 1 = 1" в конец вашего предложения SQL SQL и выполняете конкатенированные условия.
нет необходимости использовать 1 = 1, вы можете использовать 0 = 0 2 = 2,3 = 3,5 = 5 25 = 25......
select * from car_table where 0=0 and value="TOYOTA"
здесь вы также получите тот же результат, что и условие 1 = 1
потому что все эти случаи всегда являются истинным выражением
1=1 is alias for true
Ответ 10
Я сделал это, когда мне нужно применять фильтры динамически.
например, при кодировании я dunno, сколько пользователей фильтра будет применяться (fld1 = val1 и fld2 = val2 и...)
поэтому, чтобы повторить утверждение "и fld = val" я начинаем с "1 = 1".
следовательно, мне не нужно обрезать первые "и" в заявлении.