我没有很多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个空格?
答案 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
来给它一个默认值,这样方程就可以做到它应该做的事情。