Какова цель использования WHERE 1= 1 в операторах SQL?[дубликат]
-
13-09-2019 - |
Вопрос
Возможные дубликаты:
Почему 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
Как вы и сказали:
если вы добавляете условия динамически, вам не нужно беспокоиться об удалении инициала, И это может быть единственной причиной, вы правы.