利用Decode和Sign代替Case進行條件判斷

2022-02-28 18:41:16 字數 1153 閱讀 4283

在oracle的sql條件判斷中,多數情況下,因其靈活方便且可讀性強,會使用case when進行。但decode函式使用起來簡潔直觀,且可在同一行進行判斷,故在多數sql條件判斷中,我一直力求使用decode。本文基於專案實戰,簡單談談利用decode和sign代替case進行條件判斷。

先談談專案:比較產品的返修時間(repairtime)與保修截止時間(warrantytime),如返修時間在保修截止時間之前(或相同),即repairtime=< warrantytime,則該產品在保修期內(iswarranty),設欄位iswarranty值為y;返修時間在保修截止時間之後,即repairtime>warrantytime,則設為n。即達到以下效果圖:

以上需求涉及到sql中的條件判斷,若不使用case判斷,如何進行?答案如下:

select warrantytime,repairtime,

decode(sign(to_date(warrantytime,'yyyy-mm-dd') - to_date(repairtime,'yyyy-mm-dd')),-1,'n','y') as iswar

from tproductinfo

對於以上sql,簡單補習一下decode和sign兩函式的用法,若讀者已經對decode和sign函式很熟悉,下文可忽略不看。

函式語法:sign(n);

函式說明:取數字n的符號,大於0返回1,小於0返回-1,等於0返回0;

函式示例:select sign(100),sign(-100),sign(0) from dual; 返回結果分別為: 1,-1,0

函式語法:decode(input_value,value,result[,value,result…][,default_result]);

函式說明:input_value 試圖處理的數值;decode函式將該數值與一系列的序偶相比較,以決定最後的返回結果value是一組成序偶的數值;如果輸入數值與之匹配成功,則相應的結果將被返回;result 是一組成序偶的結果值;default_result 未能與任何一序偶匹配成功時,函式返回的預設值;

函式示例:對於本文實戰專案有 select decode(iswar,-1,'n','y') from dual;

好用的函式sign和decode

今天遇到了乙個問題,需要對比乙個欄位和5的大小,大於5的輸出0,小於五的輸出1。如果是用plsql程式設計的話可以用if else這種邏輯進行判斷,但是在sql裡可不能這麼寫,經過推薦,我組合使用了sign和decode,效果很好,小清新。如下 decode sign trunc col1 col2...

ORACLE的sign函式和DECODE函式

一.比較大小函式 sign 函式語法 sign n 函式說明 取數字n的符號,大於0返回1,小於0返回 1,等於0返回0 示例 1 select sign 100 sign 100 sign 0 from dual sign 100 sign 100 sign 0 1 1 0 2 a 10,b 20...

Oracle 中 sign和decode 函式用法

1 sign函式語法 sign n sign函式說明 取數字n的符號,大於0返回1,小於0返回 1,等於0返回0 n可以是表示式,n 200 例子 比較大小 a 10 b 50 sign a b 1 sign b a 1 sign a 10 02 decode的用法 含 釋 decode 條件,值1...