Oracle中空值的处理

Oracle中空值的处理,oracle,null,Oracle,Null,我有一个查询正在使用:CONTRACT\u类型进行筛选。我的合同类型包含空值和整数 我似乎无法正确处理空值,如果执行以下操作,我将返回0个结果: WHERE CONTRACT_TYPE = NVL(:CONTRACT_TYPE, CONTRACT_TYPE) 当我简单地执行以下操作时,我会得到我想要的结果: WHERE CONTRACT_TYPE is null 我希望能够传入带有null和整数的:CONTRACT_类型 谢谢大家:为了获得空值和非空值的匹配结果,您可以尝试 WHERE

我有一个查询正在使用:CONTRACT\u类型进行筛选。我的合同类型包含空值和整数

我似乎无法正确处理空值,如果执行以下操作,我将返回0个结果:

 WHERE CONTRACT_TYPE = NVL(:CONTRACT_TYPE, CONTRACT_TYPE) 
当我简单地执行以下操作时,我会得到我想要的结果:

WHERE CONTRACT_TYPE is null
我希望能够传入带有null和整数的:CONTRACT_类型


谢谢大家:

为了获得空值和非空值的匹配结果,您可以尝试

WHERE decode(:CONTRACT_TYPE, CONTRACT_TYPE, 1) = 1 

为了获得空值和非空值的匹配结果,您可以尝试

WHERE decode(:CONTRACT_TYPE, CONTRACT_TYPE, 1) = 1 
通常很简单

哪里 :CONTRACT\u TYPE不为null,CONTRACT\u TYPE=:CONTRACT\u TYPE 或 :合同类型为空,合同类型为空 很好。 但有时,当或扩展/使用concat不起作用时,您可能会遇到次优执行计划的问题。 在这种情况下,使用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_nonnullCONTRACT_类型创建基于函数的索引,并在谓词中使用它:

where sys_op_map_nonnull(CONTRACT_TYPE) = sys_op_map_nonnull(:CONTRACT_TYPE)
通常很简单

哪里 :CONTRACT\u TYPE不为null,CONTRACT\u TYPE=:CONTRACT\u TYPE 或 :合同类型为空,合同类型为空 很好。 但有时,当或扩展/使用concat不起作用时,您可能会遇到次优执行计划的问题。 在这种情况下,使用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_nonnullCONTRACT_类型创建基于函数的索引,并在谓词中使用它:

where sys_op_map_nonnull(CONTRACT_TYPE) = sys_op_map_nonnull(:CONTRACT_TYPE)

这回答了你的问题吗?SQL标准的使用与此没有区别,Oracle还不支持。因此,要么使用和/或覆盖Sayan Malakshinov所示的所有情况,要么使用bjoern81所示的解码。我经常使用DECODEcontract\u type,:contract\u type,'same','different'='same'来提高可读性。这是否回答了你的问题?SQL标准的使用与此没有区别,Oracle还不支持。因此,要么使用和/或覆盖Sayan Malakshinov所示的所有情况,要么使用bjoern81所示的解码。我经常使用decode-contract\u-type、:contract\u-type、'same'、'different'='same'来提高可读性。我知道这与这个问题的主题有点脱离,但是您知道如何允许它处理:contract\u-type中的多个整数吗?例如,传入NULL,1,2,3?@Fusiozii:由于一个绑定变量只包含一个值Oracle没有数组数据类型,因此每个参数需要一个绑定变量,例如,其中decode:CONTRACT_TYPE1,CONTRACT_type,1=1或decode:CONTRACT_TYPE2,CONTRACT_type,1=1。或者您可以使用一个字符串和字符串函数,例如where“|”|:contract|type|u string|124;”|像“%”|“|”| contract|u type| | |%”。我知道它与这个问题的主题有点不相干,但您是否知道如何允许它处理contract|u type中的多个int?例如,传入NULL,1,2,3?@Fusiozii:由于一个绑定变量只包含一个值Oracle没有数组数据类型,因此每个参数需要一个绑定变量,例如,其中decode:CONTRACT_TYPE1,CONTRACT_type,1=1或decode:CONTRACT_TYPE2,CONTRACT_type,1=1。或者您可以使用一个字符串和字符串函数,例如,where“|”|:contract|u type|u string |”|像“%”|“|”| contract|u type | |%”。