如何在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?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 如何把现有字段设为not null

SQL中 IS NULL 和IS NOT NULL

新建一个索引能够同时提升三条SQL的查询性能

sql 使用NULL和NOT NULL

mysql 插入not null 没有default报错(doesn't have a default value)

如何添加 NOT NULL 约束以及列的默认值?