在 Oracle 中处理 NULL
Dealing with NULLs in Oracle
我有一个使用 :CONTRACT_TYPE
过滤的查询。我的 contract_type 包含空值和整数。
我似乎无法正确处理空值,如果我执行以下操作,我会 return 0 个结果:
WHERE CONTRACT_TYPE = NVL(:CONTRACT_TYPE, CONTRACT_TYPE)
只要我这样做,我就会得到我想要的结果:
WHERE CONTRACT_TYPE is null
我希望能够传入 NULLS 和整数的 :CONTRACT_TYPE
。
谢谢大家:)
为了获得空值和非空值的匹配结果,您可以尝试
WHERE decode(:CONTRACT_TYPE, CONTRACT_TYPE, 1) = 1
通常很简单
WHERE
(:CONTRACT_TYPE is not null and CONTRACT_TYPE = :CONTRACT_TYPE)
or
(:CONTRACT_TYPE is null and CONTRACT_TYPE is null)
工作正常。
但有时当 or_expansion/use_concat 不起作用时,您可能会遇到次优执行计划的问题。
在这种情况下,手动 or-expansion 使用 union all
可能会有所帮助:
select ... from t where (:CONTRACT_TYPE is not null and CONTRACT_TYPE = :CONTRACT_TYPE)
union all
select ... from t where (:CONTRACT_TYPE is null and CONTRACT_TYPE is null)
或者还有另一种方法 - 使用部分记录的函数 sys_op_map_nonnull
:
在 sys_op_map_nonnull(CONTRACT_TYPE)
上创建 function-based 索引并在您的谓词中使用它:
where sys_op_map_nonnull(CONTRACT_TYPE) = sys_op_map_nonnull(:CONTRACT_TYPE)
我有一个使用 :CONTRACT_TYPE
过滤的查询。我的 contract_type 包含空值和整数。
我似乎无法正确处理空值,如果我执行以下操作,我会 return 0 个结果:
WHERE CONTRACT_TYPE = NVL(:CONTRACT_TYPE, CONTRACT_TYPE)
只要我这样做,我就会得到我想要的结果:
WHERE CONTRACT_TYPE is null
我希望能够传入 NULLS 和整数的 :CONTRACT_TYPE
。
谢谢大家:)
为了获得空值和非空值的匹配结果,您可以尝试
WHERE decode(:CONTRACT_TYPE, CONTRACT_TYPE, 1) = 1
通常很简单
WHERE
(:CONTRACT_TYPE is not null and CONTRACT_TYPE = :CONTRACT_TYPE)
or
(:CONTRACT_TYPE is null and CONTRACT_TYPE is null)
工作正常。
但有时当 or_expansion/use_concat 不起作用时,您可能会遇到次优执行计划的问题。
在这种情况下,手动 or-expansion 使用 union all
可能会有所帮助:
select ... from t where (:CONTRACT_TYPE is not null and CONTRACT_TYPE = :CONTRACT_TYPE)
union all
select ... from t where (:CONTRACT_TYPE is null and CONTRACT_TYPE is null)
或者还有另一种方法 - 使用部分记录的函数 sys_op_map_nonnull
:
在 sys_op_map_nonnull(CONTRACT_TYPE)
上创建 function-based 索引并在您的谓词中使用它:
where sys_op_map_nonnull(CONTRACT_TYPE) = sys_op_map_nonnull(:CONTRACT_TYPE)