Проверка входного параметра, если не Null, и его использование в where в SQL Server
каков наилучший способ включить входной параметр в WHERE
предложение, но исключить его, если оно равно null?
есть несколько способов, которым я верю,но я не могу вспомнить тогда.
также я мог бы использовать COALESCE()
? Но я думаю, что это только для выбора значений?
редактировать
уточнить, допустим переменную @code ="1"
потом мой, где бы Where type='B' AND code = @code
но если @code is null
тогда я только хочу Where type='B'
- заметил пропажи code = @code
.
7 ответов
можно использовать IsNull
where some_column = IsNull(@yourvariable, 'valueifnull')
редактировать:
то, что вы описали в комментарии можно сделать так:
where (@code is null or code = @code)
вот еще один подход
SELECT * FROM Thingies WHERE ( @thingId IS NULL OR ThingID = @thingId )
Если ваш параметр равен NULL, остальная часть выражения OR не будет оценена.
проверьте эту аккуратную статью здесь. Он объясняет, почему "where (@param равно null или Field=@param)" не работает хорошо и что использовать вместо этого.
Я хотел бы предложить решение, которое я нашел на другой сайт:
SELECT * FROM Thingies
WHERE ThingID = isnull(@ThingId,ThingID)
С этим решением, если пользователь выбирает null
для параметра, то запрос вернет все строки в результате.
этот вопрос действительно помог мне с аналогичной проблемой, которая заставила некоторых из нас немного почесать голову. Я пишу его только на случай, если кто-то другой попробует тот же подход и не сможет понять, почему он не работает.
Я пытался оценить только часть предложения multipart WHERE, если параметр @не был нулевым. Я попытался сделать это, как показано ниже, но всегда не возвращал строк, если @Parameter был null.
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 is @Parameter было null. Однако это делало весь where пункт return false. Лекарство было добавить или 1=1, как показано ниже:
WHERE [AlternateID] is not null
AND (@Parameter is not null AND [AlternateID] = @Parameter OR 1=1)
конечно, подход, изложенный Али (недостаточно репутации для upvote), решает это более эффективно.
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/