Неудобна ли практика создания 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'"