Взгляните на Google vizualisation API, я предполагаю, что это - то, что Google использует на Google Finance. Я взглянул на некоторых другой API диаграммы, но этот свободен и красив.
Да, это обычно потому, что он начинается как «где 1 = 0», чтобы заставить инструкцию не работать.
Это более наивный способ обернуть его в транзакцию и не фиксировать в конце, чтобы проверить свой запрос. (Это предпочтительный метод).
Это также обычная практика, когда люди создают запрос sql программно , просто проще начать с 'where 1 = 1', а затем добавить 'и customer.id =: custId 'в зависимости от того, указан ли идентификатор клиента. Таким образом, вы всегда можете добавить следующую часть запроса, начинающуюся с "и ...".
1 = 1 всегда игнорируется всеми rdbms. Нет никакого компромисса при выполнении запроса с WHERE 1 = 1 .
Создание динамических условий WHERE, таких как 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"
, тогда все ваши дополнительные предложения просто начнутся с "и"
, и вам не нужно будет выяснять.
Не то, чтобы это было ничего плохого в том, чтобы быть ленивым по своей природе. Я видел двусвязные списки, в которых «пустой» список состоит из двух контрольных узлов, и вы начинаете обработку с first-> next
до last-> prev
включительно.
Это фактически удалило весь специальный код обработки для удаления первого
и последнего
узлов. В этой настройке каждый узел был средним, поскольку вы не могли удалить первый
или последний
. Два узла были потрачены впустую, но код был проще и (хоть немного) быстрее.
Единственное другое место, где я когда-либо видел конструкцию «1 = 1», - это BIRT. В отчетах часто используются позиционные параметры и они изменяются с помощью Javascript, чтобы разрешить все значения. Таким образом, запрос:
select * from tbl where col = ?
, когда пользователь выбирает «*»
для параметра, используемого для col
, изменяется на:
select * from tbl where ((col = ?) or (1 = 1))
Это позволяет использовать новый запрос без возиться с деталями позиционного параметра. Еще есть ровно один такой параметр. Любая достойная СУБД (например, DB2 / z) оптимизирует этот запрос, чтобы полностью удалить это предложение перед попыткой построения плана выполнения, так что компромисса нет.
для параметра, используемого для столбца
, изменено на:
select * from tbl where ((col = ?) or (1 = 1))
Это позволяет использовать новый запрос без возни с деталями позиционного параметра. Еще есть ровно один такой параметр. Любая достойная СУБД (например, DB2 / z) оптимизирует этот запрос, чтобы полностью удалить это предложение перед попыткой построения плана выполнения, так что компромисса нет.
для параметра, используемого для столбца
, изменено на:
select * from tbl where ((col = ?) or (1 = 1))
Это позволяет использовать новый запрос без возни с деталями позиционного параметра. Еще есть ровно один такой параметр. Любая достойная СУБД (например, DB2 / z) оптимизирует этот запрос, чтобы полностью удалить это предложение перед попыткой построения плана выполнения, так что компромисса нет.
Использование 1 = 1 на самом деле не очень хорошая идея, так как это может вызвать полное сканирование таблицы само по себе.
См. Это -> T-SQL 1 = 1 Падение производительности
Как вы сказали:
, если вы добавляете условия динамически тебе не о чем беспокоиться об удалении начального И это может быть единственная причина, вы правы.