where子句中的Oracle / PL SQL / SQL null比较

时间:2013-06-03 12:17:45

标签: sql oracle plsql null

关于交易的问题只是查询中的空值。

例如,我的下表包含以下字段和值

TABLEX
Column1
1        
2        
3      
4        
5      
---------
Column2
null
A
B
C
null

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

CURSOR c_results IS
SELECT * FROM TABLEX where column2 = variableY

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

我不能执行上面的游标/查询,因为如果variableY为null,它将无效,因为比较应该是

CURSOR c_results IS
SELECT * FROM TABLEX where column2 IS NULL

我应该使用哪种光标/查询来容纳null或字符串变量。

很抱歉,如果我的问题有点令人困惑。我解释事情并不是那么好。提前谢谢。

8 个答案:

答案 0 :(得分:25)

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

WHERE (column2 = variableY) OR (variableY IS NULL AND column2 IS NULL)

答案 1 :(得分:6)

甲骨文问汤姆说:

where decode( col1, col2, 1, 0 ) = 0  -- finds differences

where decode( col1, col2, 1, 0 ) = 1  -- finds sameness - even if both NULL

Safely Comparing NULL Columns as Equal

答案 2 :(得分:2)

您可以使用以下内容:

SELECT * FROM TABLEX WHERE COALESCE(column2, '') = COALESCE(variableY, '')

(COALESCE采用第一个非NULL值)

请注意,这仅适用于列内容不能为''(空字符串)的情况。否则此语句将失败,因为NULL将匹配''(空字符串)。

(编辑) 你也可以考虑:

SELECT * FROM TABLEX WHERE COALESCE(column2, 'a string that never occurs') = COALESCE(variableY, 'a string that never occurs')

这将解决''失败假设。

答案 3 :(得分:2)

可能不合适取决于您正在查看的数据,但我见过(并使用过)的一个技巧是比较NVL(fieldname,somenonexistentvalue)。

例如,如果AGE是可选列,您可以使用:

if nvl(table1.AGE,-1) = nvl(table2.AGE,-1)

这取决于您知道的值永远不会被允许。年龄是一个很好的例子,薪水,序列号和其他数字,不能是负面的。字符串当然可能比较棘手 - 你可能会说你永远不会有任何名字叫'xyzzymaryhadalittlelamb'或者类似的东西,但是当你运用这个假设时,你知道他们会聘请一个有这个名字的人!!

所有这一切说:“其中a = b或(a为空,b为空)”是解决它的传统方法。这是不幸的,因为即使是有经验的程序员有时也会忘记它的一部分。

答案 4 :(得分:2)

下面类似于" top"回答但更简洁:

WHERE ((column2 = variableY ) or COALESCE( column2, variableY) IS NULL)

答案 5 :(得分:0)

尝试使用ISNULL()功能。您可以检查变量是否为null,如果是,则设置默认返回值。将null归零可能无法实现。记住:null<>空

答案 6 :(得分:0)

WHERE variableY is null or column2 = variableY 

for example:
create table t_abc (
id number(19) not null,
name varchar(20)
);

insert into t_abc(id, name) values (1, 'name');
insert into t_abc(id, name) values (2, null);
commit;

select * from t_abc where null is null or name = null;
--get all records

select * from t_abc where 'name' is null or name = 'name';
--get one record with name = 'name'

答案 7 :(得分:0)

您可以使用DUMP

SELECT * 
FROM TABLEX 
WHERE DUMP(column2) = DUMP(variableY);

<强> DBFiddle Demo

警告:这不是SARG表达式,因此不会使用索引。

使用此方法,您无需搜索数据中不存在的值(例如NVL/COALESCE)。