Я пишу Сценарий PHP, который создает SQL-запрос путем конкатенации строки и добавления условий к WHERE
пункт по мере необходимости.
Это была бы лучшая практика для использования WHERE 1=1
так, чтобы первое условие было удовлетворено, и сценарий может просто конкатенировать AND x = 'y'
к запросу, или если я пишу дополнительный код, чтобы проверить, был ли пункт добавлен и в противном случае добавляет AND
?
Первое решение допускает более чистый код в сценарии, но просто кажется неправильным мне.
Путая вопрос, я знаю. Сообщите мне, должен ли я быть более ясным.
Ограбить
создайте массив условий, определяя, какие из них вам нужны. когда вы будете готовы построить запрос, проверьте, пуст ли массив ... если он не пуст, выведите «WHERE», за которым следуют элементы, соединенные вместе с «AND».
, поскольку вы используете 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;";
?>
Чтобы развернуть ответ 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)) : '';
Я бы не стал быть слишком обидным, чтобы увидеть 1 = 1
в SQL-запросах, если это где-то объясняли.
Тем не менее, если бы я делал это на Python, я бы, вероятно, сделал что-то вроде:
query = (where_clauses or ["1=1"]).join(" AND ")
Чтобы «настоящие» запросы не нуждались в странном 1 = 1
.
Хотя 1 = 1 некрасиво, генераторы кода часто делают некрасивые вещи. Если это не код, который нужно поддерживать или понимать кому-либо (кроме разработчиков, создающих и отлаживающих генератор), то я не верю, что уродство имеет значение.
Нет, оптимизатор SQL просто отбросит 1=1
и пойдет своей дорогой.
В общем, я бы не беспокоился о производительности вообще, пока вы не столкнетесь с проблемой производительности.
Тем не менее, что-то вроде 1=1
может иметь неожиданные последствия для производительности. Пример, который застал меня врасплох, см. в этом вопросе. Но, опять же, есть случаи, когда префикс 1=1
сделает ваш запрос быстрее! Мудрый программист оптимизирует на основе измерений. Просто невозможно предсказать, как то или иное изменение повлияет на производительность.
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'"