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

#sql #altiris

#sql #altiris

Вопрос:

Я пытаюсь написать запрос для отчета 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 машин в моем общем количестве машин в отчете. Он пропускает все машины, которые имеют значения null.

 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 также сообщают о полях null.

 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))
  

Комментарии:

1. Заменяет ли система отчетности эти строки OSName и т.д.?

2. что такое N’%OSName%’ ? .. я никогда не вижу этого

3. Итак, я использую Altiris для создания пользовательских отчетов. При создании отчета Altiris я создал несколько параметров. По одному для каждого оператора WHERE. Итак, когда вы видите «LIKE N’%OSName%», у меня на самом деле создан параметр с именем OSName. Он автоматически заменил OSName на все, что у меня есть в этом поле параметра.

Ответ №1:

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

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

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

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

Комментарии:

1. Я собирался сделать комментарий о влиянии на использование индекса, но затем я увидел like %Make%

2. Да, также есть только 20 000 строк, поэтому я бы не слишком беспокоился о производительности

3. Я попытался это сделать, но ему не понравилась функция ISNULL.

Ответ №2:

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

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

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

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

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

Комментарии:

1. Вопрос по этому поводу. В моем отчете, как у меня это сейчас, когда я подключаю «HP» к параметру «Make», а затем запускаю этот запрос, он сообщает обо всех машинах с производителем HP. Но он также возвращает все нулевые машины. Исправит ли это это? Потому что изначально, до того, как я добавил оператор OR, весь мой отчет просто вырезал любую машину, на которой не было заполнено поле производителя.

2. @Jh8212 . . . Если @Make есть 'HP' , то этот запрос возвращает только строки с 'HP' .

Ответ №3:

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

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

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