Проверка входного параметра, если не Null, и его использование в SQL Server. - PullRequest
34 голосов
/ 19 ноября 2010

Каков наилучший способ включить входной параметр в предложение WHERE, но исключить его, если он нулевой?

Есть несколько способов, которым я верю, но я не могу вспомнитьзатем.

Также я могу использовать COALESCE()?Но я думаю, что это только для выбора значений?

Редактировать

Для пояснения, скажем, переменная с именем @code ="1", тогда мой где будет Where type='B' AND code = @code, но если @code is null, то я толькохочу Where type='B' - заметить пропавшего code = @code.

Ответы [ 7 ]

64 голосов
/ 19 ноября 2010

Вы можете использовать IsNull

 where some_column = IsNull(@yourvariable, 'valueifnull')

EDIT

То, что вы описали в комментарии, можно сделать так:

where (@code is null or code = @code)
9 голосов
/ 19 ноября 2010

Как насчет

WHERE (Column1 = @Var1 OR @Var1 IS NULL)
AND (Column2 = @Var2 OR @Var2 IS NULL)
7 голосов
/ 19 ноября 2010

Вот другой подход

SELECT * FROM Thingies WHERE ( @thingId IS NULL OR ThingID = @thingId )

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

6 голосов
/ 19 ноября 2010

посмотрите эту аккуратную статью здесь . Это объясняет, почему «где (@param равно нулю или Field = @ param)» не работает должным образом и что вместо этого использовать.

4 голосов
/ 14 августа 2012

Я хотел бы предложить решение, которое я нашел на другом сайте :

SELECT * FROM Thingies 
WHERE ThingID = isnull(@ThingId,ThingID)

С этим решением, если пользователь выбирает null для вашего параметра, тогда ваш запрос вернет все строки как результат.

3 голосов
/ 24 марта 2014

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

Я пытался оценить только часть составного предложения WHERE, если @Parameter не был нулевым. Я пытался сделать это, как показано ниже, но всегда не возвращал строк, если @Parameter был нулевым.

DECLARE @Parameter int = null;

SELECT  *  FROM  TABLE
WHERE   [AlternateID] is not null 
        AND (@Parameter is not null AND [AlternateID] = @Parameter)

Я неправильно подумал, что (@Parameter is not null AND [AlternateID] = @Parameter) просто не будет частью полного предложения WHERE, если @Parameter is null. Однако все предложение WHERE возвращало значение false. Средство защиты было добавить OR 1 = 1, как показано ниже:

WHERE   [AlternateID] is not null 
        AND (@Parameter is not null AND [AlternateID] = @Parameter OR 1=1)

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

WHERE   [AlternateID] is not null 
        AND [Partner_Customer_ID] = ISNULL(@Parameter, [Partner_Customer_ID])    
1 голос
/ 19 ноября 2010

Вы можете использовать ISNULL () или явно проверять наличие нулей, как уже упоминали другие.Это должно быть в порядке, если у вас есть не более 1 или 2 необязательных входных параметров.Но если есть больше параметров, этот подход будет очень неэффективным, поскольку индексы, которые вы создаете для этих столбцов, не будут использоваться, как вы ожидаете.В таком случае я бы порекомендовал вам использовать динамический SQL.Вот отличная статья, которая объясняет, почему http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/

...