Альтернатива проверке NULL и затем OR для необязательных параметров - PullRequest
1 голос
/ 13 декабря 2011

Я использую этот шаблон для необязательных параметров фильтра в моих хранимых процедурах SQL

            AND  (
                @OptionalParam IS NULL OR
                (
                    Id = @OptionalParam
                )
            )

Однако OR не является другом оптимизатора запросов. Есть ли более эффективный способ сделать это без использования динамического SQL

Ответы [ 3 ]

1 голос
/ 14 декабря 2011
AND ID = ISNULL(@OptionalParam, ID)

или вы, если у вас было несколько необязательных параметров, можете использовать

AND ID = COALESCE(@OptionalParam1, @OptionalParam2, ID)

Это определенно быстрее, чем использование оператора OR.

Как и другой упомянутый ответчик, это не будет работать, если столбец идентификатора равен нулю (но, опять же, исходное утверждение тоже не будет).

1 голос
/ 13 декабря 2011

Вы можете попробовать использовать COALESCE. Не уверен, что это будет более эффективно.

AND Id = Coalesce(@OptionalParam, Id)

Это не будет работать, если сам идентификатор равен нулю, а вы используете пустые значения ANSI.

0 голосов
/ 14 декабря 2011

Вы можете попробовать:

AND Id = CASE WHEN @OptionalParam IS NULL THEN Id ELSE NULL END

Я сомневаюсь, что это оптимизирует намного лучше, но в нем нет OR.

В качестве альтернативы, вы можете разбить ваш запрос на две составляющие- один с @OptionalParam IS NULL тестом, а другой с Id = @OptionalParam тестом, затем UNION вместе.В зависимости от вашей топологии данных это может привести к лучшим результатам.Это также может быть значительно хуже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...