參考鏈接:https://www.cnblogs.com/dqz19892013/archive/2013/04/11/3014239.html
以下的SQL全部在oracle數據庫下執行,其他數據庫是否支持這些函數,未知,有待驗證。
1.DECODE()
該函數語法如下
DECODE(expression, if1, value1, if2,value2, if3,value3, . . ., default)
意思是說,如果expression的值等於if1的值,返回value1,如果不等,再和if2比較,相等返回value2,以此類推,如果所有的條件都不滿足,返回default默認值。
看下面SQL
SELECT DECODE(1,1,'男',0,'女','未知') FROM DUAL --1 SELECT DECODE(0,1,'男',0,'女','未知') FROM DUAL --2 SELECT DECODE(3,1,'男',0,'女','未知') FROM DUAL --3 SELECT DECODE(3,1,'男',0,'女') FROM DUAL --4
第一條結果是"男",第二條結果是"女",第三條結果是"未知",第四條結果為空。
也就是說如果沒有默認值,而前面的所有條件又都沒有匹配,則返回空。
2. LAG()
這個函數可以取出某個字段前N條記錄的值。對如下表
進行下面的SQL查詢
SELECT C.*,LAG(C.CNAME,1) OVER(ORDER BY C.CNO) FROM COURSE C
所得結果如下
第一條記錄已經無法再取前一條記錄,所以LAG()函數返回空。
SQL為意思如下。
LAG(C.CNAME, 1) 表示取前一條記錄的CNAME的值。
OVER(ORDER BY C.CNO)表示按CNO來排序,然后決定記錄之間的前后關系。
在over()里面還可以加入partition by,如下SQL
SELECT C.*,LAG(C.CNAME,1) OVER(PARTITION BY C.TNO ORDER BY C.CNO) FROM COURSE C
結果如下
partition by是用來分區的。對TNO進行分區,在不同的TNO下尋找上一條記錄的CNAME的值。
所以查詢結果中t001,t002,t003中分別有一條記錄最后的值為空。
如果希望在沒有前N條記錄的時候不返回空,可以使用默認值,SQL如下
SELECT C.*,LAG(C.CNAME,1,'default') OVER(PARTITION BY C.TNO ORDER BY C.CNO) FROM COURSE C
結果如下
在原來的空值的地方出現了default,當然這個值根據自己的需要設定想要的值。
LEAD()函數與此類似,不過它是查詢某字段的后N條記錄的值。