由一個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,看看是否在不同資料庫能否查詢出資料。
下面是結果
|