Как я могу выбрать строки, которые являются нулевыми, используя связанные запросы в DBI Perl? - PullRequest
6 голосов
/ 11 января 2009

Я хочу иметь возможность передавать что-то в запрос SQL, чтобы определить, хочу ли я выбирать только те, в которых определенный столбец равен нулю. Если бы я просто строил строку запроса вместо использования связанных переменных, я бы сделал что-то вроде:

if ($search_undeleted_only)
{
    $sqlString .= " AND deleted_on IS NULL";
}

но я хочу использовать связанные запросы. Это будет лучший способ?

my $stmt = $dbh->prepare(...
    "AND (? = 0 OR deleted_on IS NULL) ");
$stmt->execute($search_undeleted_only);

Ответы [ 3 ]

4 голосов
/ 12 января 2009

Да; Связанный трюк заключается в том, что если у вас есть X потенциальных фильтров, некоторые из которых являются необязательными, нужно, чтобы шаблон говорил " AND ( ?=-1 OR some_field = ? ) ", и создавал специальную функцию, которая упаковывает вызов execute и связывает все секунды. (в этом случае -1 - это специальное значение, означающее «игнорировать этот фильтр»).

Обновление от Пола Томблина: я отредактировал ответ, включив в него предложение из комментариев.

2 голосов
/ 12 января 2009

Итак, вы полагаетесь на семантику коротких замыканий логических выражений для вызова условия IS NULL? Это похоже на работу.

Один интересный момент заключается в том, что оптимизатор запросов должен учитывать фактическое выражение, такое как 1 = 0, которое не имеет параметров. В этом случае, поскольку оптимизатор не знает, является ли выражение константой true или false до времени выполнения, это означает, что он не может его разложить. Он должен вычислять выражение для каждой строки.

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

Тогда сочетание с OR с выражением IS NULL также может иметь значение для оптимизатора. Возможно, он решит, что не может извлечь выгоду из индекса на deleted_on, тогда как в более простом выражении он будет иметь. Это зависит от используемой вами реализации СУБД и распределения значений в вашей базе данных.

1 голос
/ 12 января 2009

Я думаю, что это разумный подход. Он хорошо следует нормальному шаблону фильтра и должен обеспечивать хорошую производительность.

...