我们在 oracle 中的过程中有查询,例如,
SELECT ......
WHERE .....
AND (SomeColumn IS NULL OR SomeColumn = SomeThing)
但是我们的 DBA 说这不好,说用 NVL 代替。我们使用了很长时间,没有发现任何问题。我们应该用 NVL 更改 IS NULL 吗?从 NVL 我的意思是NVL(SomeColumn, '') = SomeThing
我们在 oracle 中的过程中有查询,例如,
SELECT ......
WHERE .....
AND (SomeColumn IS NULL OR SomeColumn = SomeThing)
但是我们的 DBA 说这不好,说用 NVL 代替。我们使用了很长时间,没有发现任何问题。我们应该用 NVL 更改 IS NULL 吗?从 NVL 我的意思是NVL(SomeColumn, '') = SomeThing
包括 Oracle 在内的许多数据库都有一个 COALESCE 函数,其行为类似于 NVL,但需要两个或多个值。当有多个列可能具有所需值和/或提供默认值时,这对于返回值很有用。
如果索引中的所有列都为 NULL,则 Oracle 不会索引该行,因此当匹配条件中有 NULL 值时,它将需要进行表扫描来检索行。在其他情况下,您有不为 NULL 的值来匹配,并且只有一列可以为 NULL。当您只想在外部表中选择一个值时,这在 OUTER JOIN 中很常见。
在任何情况下,除非您有索引 NULL 值的索引,否则将需要搜索所有候选记录。如果您有一个索引可用于将可能匹配的数量减少到少于记录的 4%,那么候选集可能包含这些行。Oracle 通常会对小表使用表扫描,或者如果没有索引可以充分限制候选行。超过 4%(可能更低)的首选将是表扫描。
您有三个条件选项:
根据我的经验,这三个都是等价的。您可以通过对查询运行解释计划来自己验证。
可以通过提示来影响计划。然而,这很容易导致次优计划。
我不确定为什么 nvl 应该比 null 更好,除非它是一个 oracle 函数(在其他 dbms 上不可用)。
我也更喜欢在 oracle 上是 null 而不是 nvl;我不会使用 nvl 因为它是一个函数并且可以(最不可能)导致全表扫描。
-> 让它向你解释,为什么它是“坏的”,并在评论中说:试试看