Подтвердить что ты не робот

SQL Server: проверка входного параметра, если не Null, и использование его там где?

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

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

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

Любая помощь действительно ценится

ИЗМЕНИТЬ

Чтобы уточнить

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

4b9b3361

Ответ 1

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

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

ИЗМЕНИТЬ

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

where (@code is null or code = @code)

Ответ 2

Как насчет

WHERE (Column1 = @Var1 OR @Var1 IS NULL)
AND (Column2 = @Var2 OR @Var2 IS NULL)

Ответ 3

ознакомьтесь с этой опрятной статьей здесь. Это объясняет, почему "где (@param равно null или Field = @param)" не работает хорошо и что использовать вместо этого.

Ответ 4

Здесь другой подход

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

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

Ответ 5

Мне нравится предлагать решение, которое я нашел на другом сайте:

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

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

Ответ 6

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

Я пытался оценить только часть многостраничного предложения 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 имеет значение 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])    

Ответ 7

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