我正在尝试为Altiris报告编写查询。该查询正在寻找机器信息。该查询工作正常,但是我遇到的问题是我的参数。我在Altiris中设置了多个参数,以允许我过滤和搜索报告中的多个字段。然后,在查询中,将这些参数添加到WHERE
语句中。
所有参数都工作正常,直到我添加了Make
和Model
参数。我们有很多机器没有将信息填充到这些字段中。因此,当我添加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))
答案 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模型值的行