如何编写查找变量OR Null的WHERE语句?

时间:2019-04-24 15:53:56

标签: sql altiris

我正在尝试为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台计算机。但是我的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 个答案:

答案 0 :(得分:1)

我猜想,如果您不输入参数值,那么它将以空字符串形式出现,当然,每个varchar都是LIKE '%%'

我不确定这是什么RDBMS,但是如果ISNULL功能可用,请尝试以下操作:

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

在进行LIKE比较之前,这会将空值替换为空字符串。

答案 1 :(得分:1)

我认为您想要这样的东西:

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

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

此方法未提供用于仅获取 NULL值的过滤方法,因为您将参数的“特殊值”用于“不应用过滤器”这里”。

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

答案 2 :(得分:0)

我认为您正在寻找类似WHERE ISNULL(Model, '') LIKE '%Model%'的东西。但是,应使用变量替换'%Model%'。上面的示例将字面上与“模型”一词匹配

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

^这将不包括具有NULL模型值的行