奇怪的Oracle查询结果

时间:2015-02-17 19:55:06

标签: sql oracle

我没有很多Oracle经验,所以如果这很明显,请原谅我:

我们有一个Employee表,其中一个名为EMPLOYEE_ADDRESS的字段定义为char(60 BYTE)

我们想要一个简单的地方,在他们的电子邮件地址字段中找不到任何人。

以下两个查询不返回任何结果:

Select * from employee where email_address is null;  -- fails because the records aren't null, they're empty;

select * from employee where email_address = '';

所以我想,也许问题是,由于字段定义,我需要60个空格,所以我尝试了这个并返回了预期的结果:

select * from employee where email_address  = '                                                            ';

这很有效,但看起来很愚蠢,我不想把它放到生产代码中。所以我继续尝试修剪结果,就像下面三个查询之一:

select * from employee where TRIM(email_address) = '';
select * from employee where RTRIM(email_address) = '';
select * from employee where LTRIM(email_address) = '';

这些都不起作用,所以感到沮丧并且只是知道它是否会起作用,我厌倦了看看修剪是否有任何影响:

select * from employee where ltrim(email_address) || 'a'  = 'a';

那很有用。 (反应......扫管笏?)

所以我首先想知道为什么使用各种修剪功能不起作用,其次,如何构造查询以便它不会真正寻找60个空格?

2 个答案:

答案 0 :(得分:2)

Select * from employee where NVL(trim(email_address), '*') <> '*';

答案 1 :(得分:1)

这将有效

select * from employee where TRIM(email_address) is null

上述原因之所以如此,并不是

select * from employee where TRIM(email_address) = ''

是因为Oracle将零长度文本视为null。

如果你想使用空单元格,你必须使用NVL来给它一个默认值,这样方程就可以做到它应该做的事情。

查看此内容以获取更多Why does Oracle 9i treat an empty string as NULL?