【问题标题】:How can I test for null and not null at the same time in sql?如何在sql中同时测试null和not null?
【发布时间】: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。

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案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,我也需要对其进行测试。
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2016-06-15
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多