Неудобна ли практика создания SQL-запроса с использованием WHERE 1 = 1 AND
Я пишу PHP script, который строит SQL-запрос, конкатенируя строку и добавляя условия к предложению WHERE
по мере необходимости.
Было бы лучше использовать WHERE 1=1
так, чтобы выполнялось первое условие, а script мог просто конкатенировать AND x = 'y'
для запроса, или мне нужно написать дополнительный код, чтобы проверить, было ли предложение добавлено, а если нет, добавьте AND
?
Первое решение позволяет использовать более чистый код в script, но мне кажется, что это неправильно.
Смущающий вопрос, я знаю. Дайте мне знать, если мне нужно быть более ясным.
Rob
Ответы
Ответ 1
создайте массив условий, когда вы определите, какие из них вам нужны. когда вы готовы построить запрос, проверьте, пуст ли массив... если он не пуст, тогда напечатайте "WHERE", а затем элементы, соединенные вместе с "AND" s.
изменить
поскольку вы используете PHP, я приведу пример кода:
<?php
$conditions = array();
if($foo == "bar") {
$conditions[] = "some_table.foo = 'bar'";
}
if($show_future) {
$conditions[] = "some_table.entry_date > NOW()";
}
$sql_where = count($conditions) ? "WHERE " . implode(" AND ", $conditions) : "";
$sql = "SELECT * FROM some_table $sql_where;";
?>
Ответ 2
Нет, оптимизатор SQL просто выбросит 1=1
и будет на своем пути.
Ответ 3
Чтобы расширить ответ Ty W, поскольку вы используете PHP:
$clauses = array();
// Optionally add one or more clauses to the array like this:
$clauses[] = "test = 2";
// Now generate the WHERE clause:
$sql = 'SELECT * FROM Table ';
$sql .= count($clauses) ? ('WHERE ' . implode(' AND ', $clauses)) : '';
Ответ 4
Я не был бы слишком обижен, чтобы видеть 1=1
в SQL-запросах, если это объяснялось где-то.
Тем не менее, если бы я делал это на Python, я бы, наверное, сделал что-то вроде:
query = (where_clauses or ["1=1"]).join(" AND ")
Чтобы "настоящие" запросы не нуждались в странном 1=1
.
Ответ 5
В общем, я вообще не буду беспокоиться о производительности, пока вы не нажмете на проблему с производительностью.
Тем не менее, что-то вроде 1=1
может иметь неожиданные последствия для производительности. Для примера, который поймал меня на удивление, см. этот вопрос. Но опять же, есть случаи, когда префикс 1=1
сделает ваш запрос быстрее! Мудрый программист оптимизируется на основе измерения. Просто невозможно предсказать, как изменение повлияет на производительность.
Ответ 6
Пока 1 = 1 вещь некрасивая, генераторы кода часто делают вещи, которые не очень хороши. Если это не код, который должен поддерживаться или пониматься кем-либо (кроме создания разработчика и отладки генератора), то я не считаю, что уродство имеет значение.
Ответ 7
PHP предлагает для этого небольшую функцию: implode
. (http://www.php.net/manual/en/function.implode.php)
Вы можете использовать его следующим образом:
$rawConditions = array("x='y'", "z='a'");
$conditions = "WHERE ".implode(" AND ", $rawConditions);
// $conditions == "WHERE x='y' AND z='a'"