SQL中的Null值

Null是表示一種「未知」的類型,除了SQL已定義的數據類型外其餘都是「未知」的類型。sql

  • Null不支持大小/相等判斷express

    Null是「未知」類型,既然「未知」類型,那就沒法判斷一個未知類型或一個已知類型與一個未知類型是否相等或大或小。因而下面這個sql語句返回的是NULL函數

select null > 0;
select null < 0;
select null = 0;

判讀是不是Null的方式是使用is null 或者 is not nullcode

select 1 is not null;
  • [not] in 與 Null排序

    例如:x not in (1,2,null) 等價於 x !=1 and x!=2 and x!=null 由於null與任何值比較都返回null因此一旦in後面的貨號裏有null值則整個查詢結果都爲null.io

    相反的若是是x in (1,2,null),則等價因而x=1 or x=2 or x=null,同理這種狀況null會被忽略.select

  • Null與排序與比較sql語句

    在排序時可使用coalesce函數將Null轉換成0,coalesce的功能:數據類型

COALESCE (expression_1, expression_2, ...,expression_n)依次參考各參數表達式,遇到非null值即中止並返回該值。若是全部的表達式都是空值,最終將返回一個空值。使用COALESCE在於大部分包含空值的表達式最終將返回空值。方法

例如coalesce(age, 0)這樣就能夠將age爲null的默認轉換成0.

排序時若是排序字段爲null則會排在最前面,若是不想讓這些null值記錄排在前面,就可使用coalesce函數消除null:
select * from user order by coalesce(age,0)

同理在比較的大小的時候也能夠這樣作,若是業務裏Null等價於0(或者其餘值)則能夠用coalesce轉換一下,例如:

select * from good where coalesce(price,0) > 55.5;
select * from user where coalesce(age,0) in (,10,20,30);
  • 被 0 除

    除數爲0是一個很是 egg-painfull 的錯誤。昨天還運行得好好的SQL,忽然被0除一會兒就出錯了。一個經常使用的解決方法是先用 case 語句判斷分母(denominator)是否爲0,再進行除法運算。這種方式其實很難看,並且分母被重複使用了。若是是簡單的狀況還好,若是分母是個很複雜的表達式,那麼悲劇就來了: 很難讀,很難維護和修改,一不當心就是一堆BUG. 這是就可使用null來解決,由於null除任何數都是null,因此可使用nullif函數將能夠能爲0的值轉出null(若是須要還能夠再使用coalesce函數將null再轉成其餘值)

select coalesce(total_sales/nullif(num_users, 0), 0);
相關文章
相關標籤/搜索