如何在sql中同时测试null而不是null?

时间:2011-12-16 14:57:43

标签: sql oracle oracle11g

我有这个sql:

select * from employees
where
lastname like '%smith%' and firstname like '%bob%' and middle like '%%'

问题是名称的值,特别是中间名,可以为null。所以上面的陈述会找到:

  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)

编辑:

中间并不总是空白。有时它会有一个值,所以我必须保持中间名的测试。它可以填充或为空。

感谢。如果重要的话,我正在使用Oracle 11g。

3 个答案:

答案 0 :(得分:5)

但是

middle like '%%' or middle is null

始终为true:middle为空,在这种情况下middle is null为真,或者包含一个或多个字符,在这种情况下middle like '%%'为真。所以你可以写:

select * from employees
where
lastname like '%smith%' and firstname like '%bob%'

答案 1 :(得分:1)

您可以使用nvl:

select * from employees
where
lastname like '%smith%' and firstname like '%bob%' and nvl(middle,'') like '%%'

但这与不检查中间名完全相同,因为'%%'将匹配除null之外的任何内容。

答案 2 :(得分:0)

也许你可以从查询中删除“中间”约束?
看起来你真的不介意它的价值,所以为什么不呢:

select * from employees
where
lastname like '%smith%' and firstname like '%bob%'