5

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

我希望应该返回一行,但是由于 where 子句检查的字段为空,因此尽管满足条件,但不会返回该行。

我在这里读到了一个很好的说明: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'))

在我的情况下,该行在 Col_One 和 Col_Two 中都有空值。

任何帮助是极大的赞赏。

谢谢。

4

4 回答 4

8

试试这个:

AND (NVL(T.Col_One,'NuLl') NOT LIKE 'AString'
      OR NVL(T.Col_Two,'NuLl') NOT IN ('BString','CString')) 
于 2012-06-26T20:41:16.607 回答
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')

请注意...

T.Col_Two NOT IN ('BString','CString') 

……相当于……

T.Col_Two <> 'BString' AND T.Col_Two <> 'CString'

...在 T.Col_Two 为 NULL 的情况下“折叠”为 NULL。

于 2012-06-26T20:42:48.607 回答
2

按照惯例NULL,不like等于或不等于任何东西——唯一有效的测试是IS NULL返回真值。

于 2012-06-26T20:43:14.850 回答
1

检查 Oracle 文档中的 NVL 函数:http: //docs.oracle.com/cd/B19306_01/server.102/b14200/functions105.htm

于 2012-06-26T22:03:06.410 回答