关于where子句的Oracle/PL SQL/SQL null比较

use*_*740 19 sql oracle null plsql

只是关于交易的问题将在查询中使用空值.

例如,我有下表,其中包含以下字段和值

TABLEX
Column1
1        
2        
3      
4        
5      
---------
Column2
null
A
B
C
null
Run Code Online (Sandbox Code Playgroud)

我在特定程序上传递变量Y. 程序里面是这样的游标

CURSOR c_results IS
SELECT * FROM TABLEX where column2 = variableY
Run Code Online (Sandbox Code Playgroud)

现在问题是变量Y可以是null,A,B或C如果变量Y是null我想选择column2为null的所有记录,否则其中column2是A,B或C.

我不能做上面的游标/查询,因为如果variableY为null,它将无法工作,因为比较应该是

CURSOR c_results IS
SELECT * FROM TABLEX where column2 IS NULL
Run Code Online (Sandbox Code Playgroud)

我应该使用哪种光标/查询来容纳null或string变量.

对不起,如果我的问题有点令人困惑.我解释事情并不是那么好.提前致谢.

ang*_*son 26

根据该参数的内容生成不同的SQL,或者像这样更改SQL:

WHERE (column2 = variableY) OR (variableY IS NULL AND column2 IS NULL)
Run Code Online (Sandbox Code Playgroud)


rgh*_*ome 6

Oracle的Ask Tom说:

where decode( col1, col2, 1, 0 ) = 0  -- finds differences
Run Code Online (Sandbox Code Playgroud)

要么

where decode( col1, col2, 1, 0 ) = 1  -- finds sameness - even if both NULL
Run Code Online (Sandbox Code Playgroud)

安全地将NULL列比较为等于