Ответ 1
Вы можете использовать IsNull
where some_column = IsNull(@yourvariable, 'valueifnull')
ИЗМЕНИТЬ
То, что вы описали в комментарии, может быть выполнено следующим образом:
where (@code is null or code = @code)
Каков наилучший способ включить параметр ввода в предложение WHERE
, но исключить его, если оно равно null?
Есть несколько способов, на которые я верю, но я не могу вспомнить их тогда.
Также я мог бы использовать COALESCE()
?? Но я думаю, что это только для значений SELECTing?
Любая помощь действительно ценится
ИЗМЕНИТЬ
Чтобы уточнить
говорит, что переменная называется @code = "1", тогда мой, где будет "Where type = 'B" AND code = @code ", но если @code имеет значение null, тогда мне нужно только" Where type =' B " - обратите внимание на недостающий код = @code
Вы можете использовать IsNull
where some_column = IsNull(@yourvariable, 'valueifnull')
ИЗМЕНИТЬ
То, что вы описали в комментарии, может быть выполнено следующим образом:
where (@code is null or code = @code)
Как насчет
WHERE (Column1 = @Var1 OR @Var1 IS NULL)
AND (Column2 = @Var2 OR @Var2 IS NULL)
ознакомьтесь с этой опрятной статьей здесь. Это объясняет, почему "где (@param равно null или Field = @param)" не работает хорошо и что использовать вместо этого.
Здесь другой подход
SELECT * FROM Thingies WHERE ( @thingId IS NULL OR ThingID = @thingId )
Если ваш параметр равен NULL, остальная часть выражения OR не будет оцениваться.
Мне нравится предлагать решение, которое я нашел на другом сайте:
SELECT * FROM Thingies
WHERE ThingID = isnull(@ThingId,ThingID)
С помощью этого решения, если пользователь выбирает null
для вашего параметра, тогда ваш запрос вернет все строки в качестве результата.
Этот вопрос действительно помог мне с аналогичной проблемой, из-за которой некоторые из нас немного почесывали головы. Я только пишу это на случай, если кто-то другой попытается использовать тот же подход и не может понять, почему он не работает.
Я пытался оценить только часть многостраничного предложения 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])
Вы можете использовать ISNULL() или явно проверить нули, как упомянули другие. Это должно быть нормально, если у вас есть не более 1 или 2 дополнительных входных параметра. Но если есть больше параметров, этот подход будет очень неэффективным, поскольку индексы, которые вы создаете в этих столбцах, не будут использоваться так, как вы ожидали. В таком случае я бы рекомендовал вам использовать динамический SQL. Вот отличная статья, которая объясняет, почему http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/