首页 > 解决方案 > 如何编写查找变量 OR Null 的 WHERE 语句?

问题描述

我正在尝试为 Altiris 报告编写查询。此查询正在查找机器信息。查询工作正常,但我遇到的问题是我的参数。我在 Altiris 中设置了多个参数,以允许我在报告中过滤和搜索多个字段。然后,在我的查询中,我将这些参数添加到WHERE语句中。

在我添加MakeModel参数之前,所有参数都工作正常。我们有很多机器没有将信息填充到这些字段中。因此,当我添加 时WHERE xxxx LIKE N'%Make%',我失去了大约 500 台基于它的机器,现在只寻找具有该领域某些东西的机器。我尝试通过添加如下行来解决此问题:

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

这种工作,现在报告显示所有机器......但是如果我在Make参数字段中输入“HP”然后重新运行报告......它显示了我想要的所有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 台机器。但我的品牌/型号字段也报告空字段。

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

标签: sqlaltiris

解决方案


我想你想要这样的东西:

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

我使用= ''而不是IS NULL因为您显然没有将参数作为NULL值传递(LIKE不起作用)。

这不提供过滤方法以仅获取值NULL,因为您使用参数的“特殊值”来表示“不要在此处应用过滤器”。

请注意,cs它旨在用作表别名。我还强烈建议您使用表别名,以便您的查询更易于编写和阅读。


推荐阅读