【问题标题】:Convert "column = null" to "column is null"?将“column = null”转换为“column is null”?
【发布时间】:2013-09-25 03:00:51
【问题描述】:

我有一个从游标动态获取值的简单存储过程。问题是在不同的点上,一些绑定值可能是 NULL。 我希望以后能够在另一个查询中使用这些绑定值,例如:

select * from table
where column = value;

问题是value 是NULL,这会破坏查询。我意识到我需要做一个where column is null,过去我在评估值后创建了动态查询。

我怎样才能简单地进行这种比较以涵盖 NULL 值和填充的 VARCHAR2 值?

【问题讨论】:

  • SQL-99 用“a IS NOT DISTINCT FROM b”解决了这个问题,我相信 10g 不支持。

标签: sql oracle syntax null oracle10g


【解决方案1】:

使用 NVl(value,'value to assign if null')

这是特定于 oracle 的。

【讨论】:

    【解决方案2】:

    一个简单的解决方案是:

    where ((value is null     and column is null) or
           (value is not null and column = value))
    

    您可能希望确保列上的索引实际上位于 (column,0) 上,以便包含空值(并且优化器知道它们已包含在内)。

    【讨论】:

    • 感谢您对索引的评论。我们过去也遇到过这个问题,正是出于这个原因创建了一个基于函数的索引。 dba-oracle.com/oracle_tips_null_idx.htm
    • 关于那篇文章:这不是 11g 的“新语法”,而是 8i 中基于函数的常规索引语法。 ANSI Coalesce() 比 Nvl() 更好——由于短路评估,通常更快,并且它接受两个以上的参数。第四个创建索引示例的语法无效——字母“o”而不是 0,周围没有引号。许多版本的索引在创建过程中已自动收集统计信息,因此无需单独运行。您不需要使用提示来使用基于函数的索引,实际上提示不会“强制”任何事情。不令人印象深刻。
    【解决方案3】:

    如果您希望 NULL 值比较为相等:

    select *
    from table
    where (column = value or column is null and value is null);
    

    【讨论】:

    • 我有 column = value or column is null 并意识到它不正确。我什至没有意识到还要检查该值是否为空。简单明了。谢谢!
    • 恭喜你获得 100k,戈登! :)
    【解决方案4】:

    where (column is null) OR (column = value) 或许?

    【讨论】:

    • 这可能会在执行期间我无法控制输入的存储过程中获取意外值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2013-11-02
    • 2015-11-04
    • 1970-01-01
    相关资源
    最近更新 更多