Ответ 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".
следовательно, мне не нужно обрезать первые "и" в заявлении.