Как я могу написать оператор WHERE, который ищет переменную OR Null? - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь написать запрос для отчета 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%') 

Вот как я пытался это исправить, и теперь я получаю все 20 000 машин. Но мои поля 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 ]

1 голос
/ 24 апреля 2019

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

Я не уверенчто это за СУРБД, но если доступна функция ISNULL, попробуйте следующее:

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

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

1 голос
/ 24 апреля 2019

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

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

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

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

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

0 голосов
/ 24 апреля 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...