如何在Oracle中的NOT IN和NOT LIKE语句中处理空值?

dee*_*dee 4 sql oracle where-clause notin

我有一个很长的PL/SQL,除了where子句的一小部分外,它运行良好.

我期望应该返回一行,但是,因为where子句检查的字段为null,所以尽管符合条件,仍不会返回该行.

我在这里读了一篇非常好的说明:http:
//jonathanlewis.wordpress.com/2007/02/25/not-in/

它解释了Null如何影响NOT IN语句,我认为它也不同于NOT LIKE.

我无法找到的是我需要的替代品.我是否需要以某种方式将其切换为IN和LIKE,或者如果NUll提供返回行的内容?

这是我的代码的简化版本.

SELECT * FROM Temp_Table T
WHERE -- Other where constraints
AND (T.Col_One NOT LIKE 'AString'
     OR T.Col_Two NOT IN ('BString','CString'))
Run Code Online (Sandbox Code Playgroud)

在我的情况下,Col_One和Col_Two中的行都将为空.

任何帮助是极大的赞赏.

谢谢.

DCo*_*kie 7

尝试这个:

AND (NVL(T.Col_One,'NuLl') NOT LIKE 'AString'
      OR NVL(T.Col_Two,'NuLl') NOT IN ('BString','CString')) 
Run Code Online (Sandbox Code Playgroud)

  • 这不是一般的解决方案。尽管在这种情况下,我们知道'AString'不能为'NuLl',但在现实生活中,这很可能是绑定参数,并且客户端应用程序必须保证永远不会将'NuLl'传递给它。最好简单地显式测试NULL,并避免对“ magic”值的任何依赖。 (4认同)

Bra*_*vic 5

这样的事情应该有效:

T.Col_One IS NULL OR T.Col_One NOT LIKE 'AString'
OR T.Col_Two IS NULL OR T.Col_Two NOT IN ('BString','CString')
Run Code Online (Sandbox Code Playgroud)

请注意......

T.Col_Two NOT IN ('BString','CString') 
Run Code Online (Sandbox Code Playgroud)

......相当于......

T.Col_Two <> 'BString' AND T.Col_Two <> 'CString'
Run Code Online (Sandbox Code Playgroud)

...如果T.Col_Two为NULL,则"折叠"为NULL.