SQL - Order By如何處理NULL

問題來了。執行SQL語句

SELECT * FROM tbl ORDER BY x, y

如果用來排序的列x、y當中有NULL值,那麼它們的順序是怎樣的呢?

不同的數據庫有不同的答案,目前的主流數據庫大致分爲兩派。

 

一、NULL最大派

這一派包括PostgreSQL、Oracle、DB2等。它們的原則是,排序時NULL比其他的值都要大。

最大派還有一個共性,就是都支持NULLS FIST/LAST關鍵字。它可以強制指定NULL在排序結果中的位置。NULLS FIRST會將所有NULL放到排序結果的最前面,NULLS LAST則將NULL放到所有結果的後面。兩種情況都無視排序是升序的還是降序的。

用法如下

SELECT * FROM tbl ORDER BY x NULLS FIRST, y DESC NULLS LAST

 

二、NULL最小派

最小派認爲排序時NULL小於所有的值。屬於這一派的有MySQL、SQL Server等。還有Apache Hive也是這一派……如果你認爲它是數據庫的話。

上面三個最小派成員都不支持NULLS FIRST/LAST關鍵字。如果你有什麼想不開,非要改變NULL的默認排序,只能運用一些技巧了。比如這樣

SELECT * FROM tbl ORDER BY IF(ISNULL(x), 1, 0)

這裏使用了IF和ISNULL兩個函數,相當於創建了一個新列。如果x是NULL,這一列是1;如果x不是NULL,這一列是0。對新列排序,相當於NULL變成了最大值。

最小派裏還有一個另類人物,SparkSQL。它不是數據庫,但是支持SQL。SparkSQL也將NULL視爲最小,同時它也支持NULLS FIRST/LAST。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章