Значение WHERE 1 в MySQL-запросах

При создании запроса MySQL без ограничений WHERE большинство людей используют запрос WHERE 1 в запросе. Однако исключение WHERE 1 не влияет на запрос. Есть ли разница между этими двумя? Можно ли считать, что это лучшая практика?

3 ответа

Я не думаю, что это вопрос наилучшей практики, но люди иногда используют его для упрощения построения динамических запросов.

string sql = "SELECT * FROM mytable WHERE 1 ";
if ( somecondition ) {
 sql += "AND somefield = somevalue ";
}
if ( someothercondition ) {
 sql += "AND someotherfield = someothervalue ";
}
... etc

Без WHERE 1 там мне нужно будет проверить каждый блок if, нужно ли мне вставлять WHERE или AND.


Это не нужно. 99,9% времени это просто означает, что запрос был динамически сконструирован, а ввод WHERE 1 приводит к более простой логике для динамических условных предложений, что означает, что вы можете просто добавлять AND id = 3 в конец запроса и не нарушать синтаксис. Если у вас нет WHERE 1, вам нужно беспокоиться о том, есть ли предложение WHERE и следует ли добавлять условие с помощью AND или нет.

Так что это просто лень в основном.


Это еще один пример угла для автоматических генераторов кода и других манипуляторов SQL-операторов. Запустив раздел фильтрации с помощью where 1 (или where 1 = 1), ваш автоматический генератор кода может просто добавлять новые фильтры с префиксом and.

В противном случае вы, как правило, получаете код вроде:

query = "select * from tbl"
sep = " where "
foreach clause in all_clauses:
 query = query + sep + clause
 sep = "and "

который не так чист, как:

query = "select * from tbl where 1 = 1"
foreach clause in all_clauses:
 query = query + " and " + clause

Он должен иметь очень мало отличий от любой достойной СУБД, так как механизм выполнения должен лишить эти типы предложений до выполнения запроса.

Будет ли это лучше всего практиковать или нет, зависит от того, хотите ли вы иметь более "чистый" код в ваших генераторах запросов или хотите ли вы, чтобы администраторы баз данных пытались отследить вас и избили вас до смерти за использование таких глупых clauses:-) Конечно, если вы используете MySQL, вы можете быть администратором баз данных, чтобы это не было проблемой.

licensed under cc by-sa 3.0 with attribution.