Как я могу написать оператор WHERE, который ищет переменную OR Null?

Я пытаюсь написать запрос для отчета Altiris. Этот запрос ищет информацию о машине. Запрос работает нормально, но проблема, с которой я сталкиваюсь, связана с моими параметрами. Я настроил несколько параметров в Altiris, чтобы позволить мне фильтровать и искать в отчете по нескольким полям. Затем в своем запросе я добавляю эти параметры в WHERE заявления.

Все параметры работали нормально, пока я не добавил Make а также Model параметры. У нас есть немало машин, которые не имеют информации, заполненной этими полями. Поэтому, когда я добавляю в WHERE xxxx LIKE N'%Make%'Я теряю около 500 машин на его основе, и теперь ищу только машины с чем-то в этой области. Я попытался исправить это, добавив строки, подобные следующим:

Where ((xxxx LIKE N'%Make%' OR xxxx is null))

Этот вид работал, в том, что теперь отчет показывает все машины... Но если я введу "HP" в Make поле параметра, а затем повторно запустите отчет... он показывает все машины HP, как я хочу, но также и все нулевые машины.

Как я могу переписать свои операторы where, чтобы они не исключали машины из отчета, и позволяли мне фильтровать по всем машинам HP, не показывая также нулевые значения?

Надеюсь, что это имело смысл, и спасибо

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

WHERE
  (dbo.OS_Version.[OS Name] LIKE N'%OSName%') AND 
  (dbo.OS_Version.[OS Version] LIKE N'%Build%') AND 
  (dbo.OS_Version.Name LIKE N'%Name%') AND 
  (dbo.Inv_AeX_AC_Identification.[Hardware Serial Number] LIKE N'%Serial%') AND
  (dbo.vHWComputerSystem.Manufacturer LIKE N'%Make%') AND
  (dbo.vHWComputerSystem.Model LIKE N'%Model%') 

Вот как я пытался это исправить, и теперь я получаю все 20000 машин. Но мои поля make/model также содержат пустые поля.

WHERE
  (dbo.OS_Version.[OS Name] LIKE N'%OSName%') AND
  (dbo.OS_Version.[OS Version] LIKE N'%Build%') AND 
  (dbo.OS_Version.Name LIKE N'%Name%') AND 
  (dbo.Inv_AeX_AC_Identification.[Hardware Serial Number] LIKE N'%Serial%') AND
  ((dbo.vHWComputerSystem.Manufacturer LIKE N'%Make%') OR (dbo.vHWComputerSystem.Manufacturer is null)) AND
  ((dbo.vHWComputerSystem.Model LIKE N'%Model%') OR (dbo.vHWComputerSystem.Model is null))

3 ответа

Я думаю, что вы хотите что-то вроде этого:

  (cs.Manufacturer LIKE N'%@Make%' OR @Make = '') AND
  (cs.Model LIKE N'%@Model%' OR @Model = '') 

я использую = '' скорее, чем IS NULL потому что вы явно не передаете параметры как NULL значения (LIKE не сработает).

Это не обеспечивает метод фильтрации, чтобы получить только NULL значения, потому что вы используете "специальное значение", чтобы параметр означал "не применять фильтр здесь".

Обратите внимание, что cs предназначен как псевдоним таблицы. Я также настоятельно рекомендую использовать псевдонимы таблиц, чтобы ваши запросы было легче писать и читать.

Я предполагаю, что если вы не введете значение для параметра, оно будет отображаться как пустая строка, и, конечно, каждый varchar LIKE '%%',

Я не уверен, что такое RDBMS, но если ISNULL функция доступна, попробуйте это:

where ((ISNULL(xxxx,'') LIKE N'%Make%')

Это заменяет нули пустой строкой перед выполнением LIKE сравнение.

Я думаю, что вы ищете что-то вроде WHERE ISNULL(Model, '') LIKE '%Model%', Однако вам следует заменить "%Model%" на переменную. Приведенный выше пример будет буквально соответствовать слову "Модель"

DECLARE @Model NVARCHAR(100) = 'T-800'
...
WHERE ISNULL(Model, '') LIKE '%' + @Model + '%'

^ Это не будет включать строки со значениями модели NULL

Другие вопросы по тегам