如何在sql中同时测试null和not null?
Posted
技术标签:
【中文标题】如何在sql中同时测试null和not null?【英文标题】:How can I test for null and not null at the same time in sql? 【发布时间】:2011-12-16 14:57:42 【问题描述】:我有这个 sql:
select * from employees
where
lastname like '%smith%' and firstname like '%bob%' and middle like '%%'
问题是名称的值,尤其是中间名,可以为空。所以上面的语句会发现:
smith, bob mike
但找不到
smith, bob
因为 Bob 的中间名是 null(他没有中间名。)
我有这个可行的方法,但我认为有更好的方法并想要输入:
select * from employees
where
lastname like '%smith%'
and firstname like '%bob%'
and (middle like '%%' or middle is null)
编辑:
middle 并不总是空白。有时它会有一个值,所以我必须保留中间名的测试。它可以填充或为空。
谢谢。如果这很重要,我正在使用 Oracle 11g。
【问题讨论】:
【参考方案1】:但是
middle like '%%' or middle is null
始终为真:要么middle
为空,在这种情况下middle is null
为真,要么它包含一个或多个字符,在这种情况下middle like '%%'
为真。所以你可以写:
select * from employees
where
lastname like '%smith%' and firstname like '%bob%'
【讨论】:
但有时它们会有中间名,例如 middle like %albert%,所以我必须测试所有这些。 @johnny:你是说你想要middle LIKE '%albert%' OR middle IS NULL
的等价物吗?也就是说,即使查询指定了middle LIKE '%albert%'
,您也希望在middle IS NULL
? 时跳过该检查?
我是说中间可以有一个值或者为空。它总是有一个或另一个。【参考方案2】:
你可以使用 nvl:
select * from employees
where
lastname like '%smith%' and firstname like '%bob%' and nvl(middle,'') like '%%'
但这与根本不检查中间名是一样的,因为 '%%' 将匹配除 null 之外的任何内容。
【讨论】:
和 ruakh 说的差不多,中间的 '%%' 或 middle is null 总是会返回 true,所以不需要包含它。 middle 并不总是 %% 它可以有一个值。 我觉得这个和我的一样,但是更漂亮。 那行不通:在 Oracle 中,''
为 null(Oracle 中没有空字符串的概念,即使作为中间值;任何看起来应该是空字符串的东西都是实际上为空),所以NVL(middle, '') LIKE '%%'
表示NVL(middle, NULL) LIKE '%%'
表示middle LIKE '%%'
,并且仅当middle
为非空时才为真。
到目前为止似乎工作正常。真的,我不知道为什么。它正在拾取空值和非空值。 nvl(middle,'') 表示将 null 替换为 ''。我输入了'n/a'。【参考方案3】:
也许您可以从查询中删除“中间”约束? 看起来你并不真正介意它的价值,所以为什么不只是:
select * from employees
where
lastname like '%smith%' and firstname like '%bob%'
【讨论】:
不,我关心中间的值是多少。我只放 %% 是因为它不会获取 null 并且有时中间不会为 null,我也需要对其进行测试。以上是关于如何在sql中同时测试null和not null?的主要内容,如果未能解决你的问题,请参考以下文章