Какова цель использования WHERE 1= 1 в операторах SQL?[дубликат]

StackOverflow https://stackoverflow.com/questions/1264681

Вопрос

Возможные дубликаты:
Почему sql-запрос должен содержать “где 1 = 1”?
Зачем кому-то использовать WHERE 1= 1 И <conditions> в предложении SQL?

Я часто видел это в разных примерах запросов, и это относится, вероятно, ко всем SQL-системам.

Если есть запрос, в котором не определены условия, люди (и особенно фреймворки ORM) часто добавляют условие always-true WHERE 1 = 1 или что-то в этом роде.

Так что вместо

SELECT id, name FROM users;

они используют

SELECT id, name FROM users WHERE 1 = 1;

Единственная возможная причина, о которой я мог подумать, если вы добавляете условия динамически, вам не нужно беспокоиться об удалении начального AND но все же довольно часто это 1 = 1 условие удаляется, если в запросе есть фактическое условие.

Фактический пример из CakePHP (сгенерированный фреймворком):

(без каких-либо условий)

SELECT `User`.`id`, `User`.`login`
FROM `users` AS `User` WHERE 1 = 1 
ORDER BY `User`.`id` ASC;

(с условием)

SELECT `User`.`id`, `User`.`login`
FROM `users` AS `User` 
WHERE `User`.`login` = 'me@example.com'
LIMIT 1;

Есть ли какая-либо причина для добавления этого дополнительного условия?

Это было полезно?

Решение

Да, обычно это происходит потому, что оно начинается со слов «где 1 = 0», что приводит к сбою оператора.

Это более наивный способ обернуть его в транзакцию и не фиксировать ее в конце, чтобы проверить ваш запрос.(Это предпочтительный метод).

Другие советы

Это также обычная практика, когда люди программное построение запроса sql, проще начать с 'where 1=1', а затем добавить ' и customer.id=:custId' в зависимости от того, указан ли идентификатор клиента.Таким образом, вы всегда можете добавить следующую часть запроса, начиная с «и…».

Тот Самый 1=1 всегда игнорируется всеми СУБД.Нет никакого компромисса при выполнении запроса с ГДЕ 1=1.

Динамическое построение ТАМ, где условия, такие как фреймворки ORM или другие, выполняются очень часто, проще добавить реальный где условия, потому что вы избегаете проверки добавления И к текущему состоянию.

stmt += "WHERE 1=1";
if (v != null) {
   stmt += (" AND col = " + v.ToString());
}

Вот как это выглядит без 1= 1.

var firstCondition = true;
...
if (v != null) {
   if (!firstCondition) {
      stmt += " AND ";
   }
   else {
       stmt += " WHERE ";
       firstCondition = false;
   }
   stmt += "col = " + v.ToString());
}

Люди используют его, потому что они по своей природе ленивы при построении динамических SQL-запросов.Если вы начнете с "where 1 = 1" тогда все ваши дополнительные предложения начинаются с "and" и вам не обязательно разбираться.

Не то чтобы в лени по своей природе было что-то плохое.Я видел двусвязные списки, в которых «пустой» список состоит из двух дозорных узлов, и обработка начинается с first->next до тех пор, пока last->prev включительно.

Это фактически удалило весь специальный код обработки для удаления. first и last узлы.В этой установке каждый узел был средним узлом, так как вы не могли удалить first или last.Два узла были потрачены впустую, но код стал проще и (немного) быстрее.

Единственное место, где я когда-либо видел конструкцию «1 = 1», — это BIRT.В отчетах часто используются позиционные параметры, и они модифицируются с помощью Javascript, чтобы разрешить все значения.Итак, запрос:

select * from tbl where col = ?

когда пользователь выбирает "*" для параметра, используемого для col изменен следующим образом:

select * from tbl where ((col = ?) or (1 = 1))

Это позволяет использовать новый запрос, не возясь с деталями позиционных параметров.Есть еще ровно один такой параметр.Любая приличная СУБД (например, DB2/z) оптимизирует этот запрос, полностью удаляя это предложение, прежде чем пытаться построить план выполнения, поэтому компромисса нет.

Использование 1=1 на самом деле не очень хорошая идея, поскольку это само по себе может привести к полному сканированию таблицы.

Посмотрите это --> Снижение производительности T-SQL 1=1

Как вы и сказали:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top