T-SQL Где int = @ var / @ var = null? - PullRequest
       33

T-SQL Где int = @ var / @ var = null?

2 голосов
/ 21 февраля 2012

У меня возникла ситуация, когда я вызываю хранимую процедуру и передаю некоторые переменные.В некоторых случаях я передаю null, и я хочу, чтобы он возвращал все.Возьмем следующее (возраст - столбец целых чисел):

[Table]  
[Name] | [Age]  
Mike   | 22  
Fred   | 18  
Bob    | 22 



SELECT * FROM [table] WHERE [Age]=@AgeVar

Теперь, если я пройду через 22, я получу Майка и Боба.Точно так же прохождение через 18 даст мне Фред.Однако что делать, если я хочу, чтобы все 3 строки передавались в null / not set @AgeVar?Это моя проблема в очень простом масштабе.

Редактировать: Sproc довольно сложный, и я действительно не хочу удваивать все разделы, чтобы их было вдвое больше, чем в одном из ответов ниже.Есть ли другие методы?

Ответы [ 4 ]

9 голосов
/ 21 февраля 2012
SELECT * FROM [table] WHERE [Age]=@AgeVar OR @AgeVar IS NULL

Как уже упоминалось много раз выше и ниже, эта техника снизит производительность ваших запросов для больших таблиц. Пользователь остерегается.

3 голосов
/ 21 февраля 2012
IF @AgeVar IS NULL 
    BEGIN
        SELECT  *
        FROM    @Table
    END
ELSE
    BEGIN
        SELECT  *
        FROM    @Table
        WHERE   Age = @AgeVar
    END
1 голос
/ 28 апреля 2012

Это даст вам НАМНОГО лучшую производительность, чем метод [Age]=@AgeVar OR @AgeVar IS NULL, потому что он будет генерировать поиск индекса вместо сканирования индекса:

SELECT * FROM [Table1]
WHERE COALESCE(@AgeVar, Age) = Age

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

1 голос
/ 21 февраля 2012

Я обнаружил, что если у вас общий случай, используйте оператор CASE. Это сделает перетаскивание производительности только в редком случае. Поэтому, если вы чаще передаете значение NULL в качестве параметра, это будет более эффективным.

SELECT * 
FROM [table] 
WHERE 
    0 = 
        CASE 
            WHEN @AgeVar IS NULL THEN 0
            WHEN [Age]=@AgeVar THEN 0
        END
...