Это - плохая практика для создания использования SQL-запроса ГДЕ 1=1 И

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

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

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

Путая вопрос, я знаю. Сообщите мне, должен ли я быть более ясным.

Ограбить

10
задан Álvaro González 12 April 2010 в 15:54
поделиться

7 ответов

создайте массив условий, определяя, какие из них вам нужны. когда вы будете готовы построить запрос, проверьте, пуст ли массив ... если он не пуст, выведите «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;";
?>
7
ответ дан 3 December 2019 в 17:19
поделиться

Чтобы развернуть ответ 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
ответ дан 3 December 2019 в 17:19
поделиться

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

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

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

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

1
ответ дан 3 December 2019 в 17:19
поделиться

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

1
ответ дан 3 December 2019 в 17:19
поделиться

Нет, оптимизатор SQL просто отбросит 1=1 и пойдет своей дорогой.

10
ответ дан 3 December 2019 в 17:19
поделиться

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

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

1
ответ дан 3 December 2019 в 17:19
поделиться

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
ответ дан 3 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: