Oralce用不等於空串判斷查詢不出任何資料

球你嘞~發表於2024-11-14

由一個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

相關文章