由一个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,看看是否在不同数据库能否查询出数据。
下面是结果
|