1. 程式人生 > >CASE WHEN 語句在Oracle和Sybase庫中的不同

CASE WHEN 語句在Oracle和Sybase庫中的不同

今天提交程式之後,反應有BUG,經仔細查詢,發現一個之前並沒注意到的問題,那就是case when 語句在Oracle中執行的BUG,用指令碼來說明;

Oracle

--建表
CREATE TABLE TABLE_01 
(CODE INT NOT NULL,
NAME VARCHAR2(20) NULL);
--插入數值,之所以分別插入null和''是因為在Sybase中''和null是兩個不同的值
INSERT INTO TABLE_01 VALUES (1,'');
INSERT INTO TABLE_01 VALUES (2,NULL);
SELECT * FROM TABLE_01;
查詢結果為:


使用不同的兩種case when 語句查詢:

SELECT CASE NAME WHEN '' THEN '1' WHEN NULL THEN '2' ELSE '3' END FROM TABLE_01 WHERE CODE=1;
SELECT CASE WHEN NAME='' THEN '1' WHEN NAME IS NULL THEN '2' ELSE '3' END FROM TABLE_01 WHERE CODE=1;

前者結果為3  後者結果為 2。也就是說case when 這兩種方法Oracle雖然都能執行且不報錯,但結果卻完全不同,第一種寫法無法比出null值。

SELECT CASE NAME WHEN '' THEN '1' WHEN NULL THEN '2' ELSE '3' END FROM TABLE_01 WHERE CODE=1;
SELECT CASE WHEN NAME='' THEN '1' WHEN NAME IS NULL THEN '2' ELSE '3' END FROM TABLE_01 WHERE CODE=1;

Sybase

--建表
CREATE TABLE TABLE_01 
(CODE INT NOT NULL,
NAME VARCHAR(20) NULL) 
--插入數值,之所以分別插入null和''是因為在Sybase中''和null是兩個不同的值
INSERT INTO TABLE_01 VALUES (1,'') 
INSERT INTO TABLE_01 VALUES (2,NULL) 
SELECT * FROM TABLE_01 
查詢結果為:,由此可見sybase中‘’和null不是一個值。

使用兩種case when 查詢結果:


結論:case when的兩種寫法,在sybase中隨便使用,而在Oracle中則只能用case when cloumn=? then ? when column=? then ? else ? end 這種寫法。