sql - 如何编写查找变量 OR Null 的 WHERE 语句?
问题描述
我正在尝试为 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 台机器。但我的品牌/型号字段也报告空字段。
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))
解决方案
我想你想要这样的东西:
(cs.Manufacturer LIKE N'%@Make%' OR @Make = '') AND
(cs.Model LIKE N'%@Model%' OR @Model = '')
我使用= ''
而不是IS NULL
因为您显然没有将参数作为NULL
值传递(LIKE
不起作用)。
这不提供过滤方法以仅获取值NULL
,因为您使用参数的“特殊值”来表示“不要在此处应用过滤器”。
请注意,cs
它旨在用作表别名。我还强烈建议您使用表别名,以便您的查询更易于编写和阅读。
推荐阅读
- visual-studio - 在断点处执行带有副作用的 C# 代码
- r - 根据不同列中的值将一列中的值替换为 NA
- css - CSS垂直表单步骤指示器?
- webpack - 无法安装 vue + webpack 模板
- sql - 您可以在 SQL 中为自定义计算创建一个底行吗?
- android - 如何跟踪 UI 是否在 Android 中完全绘制?
- javascript - 试图获取父文档的子集合
- angular - Angular 通用主页加载问题
- r - 当我尝试在 R 上安装 keras 时出错 (devtools::install_github("rstudio/keras")
- f# - 计算表达式中的“do”块出错了?