Является ли плохой практикой построение SQL-запроса с использованием, ГДЕ 1=1 И


Я пишу PHP-скрипт, который строит SQL-запрос, объединяя строку и добавляя условия в предложение WHERE по мере необходимости.

Было бы лучше использовать WHERE 1=1, чтобы первое условие было выполнено, и сценарий мог просто объединить AND x = 'y' с запросом, или мне следует написать дополнительный код, чтобы проверить, было ли добавлено предложение, а если нет, добавьте AND ?

Первое решение позволяет использовать более чистый код в скрипте, но просто кажется неправильным я.

Запутанный вопрос, я знаю. Дайте мне знать, если мне нужно быть более ясным.

Роб

Author: Álvaro González, 2010-04-12

7 answers

Создайте массив условий, определяя, какие из них вам нужны. когда вы будете готовы построить запрос, проверьте, пуст ли массив... если он не пустой, то выведите "ГДЕ", за которым следуют элементы, соединенные вместе с "И"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;";
?>
 7
Author: Ty W, 2010-04-12 16:36:40

Нет, оптимизатор SQL просто выбросит 1=1 и отправится в путь.

 10
Author: KM., 2010-04-12 15:43:53

Чтобы расширить ответ 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)) : '';
 2
Author: Jon Benedicto, 2010-04-12 15:56:13

Я бы не слишком обиделся, если бы увидел 1=1 в SQL-запросах, если бы это где-то объяснялось.

Тем не менее, если бы я делал это на Python, я бы, вероятно, сделал что-то вроде:

query = (where_clauses or ["1=1"]).join(" AND ")

Чтобы "настоящие" запросы не нуждались в странных 1=1.

 1
Author: David Wolever, 2010-04-12 15:46:58

В общем, я бы вообще не беспокоился о производительности, пока вы действительно не столкнетесь с проблемой производительности.

Тем не менее, что-то вроде 1=1 может иметь удивительные последствия для производительности. Пример, который застал меня врасплох, см. этот вопрос. Но опять же, есть также случаи, когда добавление префикса 1=1 ускорит ваш запрос! Мудрый программист оптимизирует на основе измерений. Просто невозможно предсказать, как изменение повлияет на производительность.

 1
Author: Andomar, 2017-05-23 10:33:16

В то время как 1=1 вещь не очень приятная, генераторы кода часто делают вещи, которые не очень приятны. Если это не код, который должен поддерживаться или пониматься кем-либо (кроме разработчика, создающего и отлаживающего генератор), то я не верю, что уродство имеет значение.

 1
Author: Ray, 2010-04-12 15:58:25

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'"
 1
Author: phimuemue, 2010-04-12 16:07:25