Oralce用不等于空串判断查询不出任何数据

由一个sql引发的思考:

select * from z_test1 where id <> ''

先说结果:在oracle中啥也查不出来
原因是:oracle中对空串都会视为NULL处理,如上sql等同于

select * from z_test1 where id <> NULL

但是对NULL执行 = <>结果都是false;
对空的处理需要用函数 IS NULL 或者 IS NOT NULL处理

下面详细说下为啥会有这个问题(多数据库sql兼容问题)
1、我有一个表z_test1,表里有id字段,其中id中存在null和空串的数据
为了方便复现问题,建立表并插入数据

create table z_test1( id VARCHAR(36))
insert into z_test1 (id) values (null)
insert into z_test1 (id) values (‘’)
insert into z_test1 (id) values (‘111’)

2、只查询id不为空而且不为空串的数据
3、执行如下sql

select * from z_test1 where id is not null and id <> ''

在pg数据库没有任何问题,只查询出了111的那条数据,没有问题

 

 

但是拿这个sql去Oracle执行发现并没有查询出数据来,这样就有问题了。

 

原因是上述Oralce对空串的处理,结论是为了兼容多数据库最好不要在表中插入NULL又插入空串,最好只插入NULL

4、扩展,各个数据对空串的处理是否和Oracle一样,对此查询了各数据库的结果。
sql还是那个sql,看看是否在不同数据库能否查询出数据。
下面是结果

 
<>‘’ 能否正常过滤结果(Y能/N否)
Oracle N
Mysql Y
SqlServer Y
达梦 Y
瀚高 Y
人大金仓 N
OSCAR Y
Postgrep Sql Y
 
posted @ 2024-11-14 09:33  球你嘞~  阅读(20)  评论(0编辑  收藏  举报