問題來了。執行SQL語句 如果用來排序的列x、y當中有NULL值,那麼它們的順序是怎樣的呢? 不同的資料庫有不同的答案,目前的主流資料庫大致分為兩派。 一、NULL最大派 這一派包括PostgreSQL、Oracle、DB2等。它們的原則是,排序時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。