Contents

mysql COALESCE 取代null值好方法

以前前公司有用 DB2 的 VALUE(),後來換到 MySQL 時一度很想找類似語法,最後才重新認真記住 COALESCE()。這個函式真的很常用,尤其在報表、查詢結果格式化、欄位預設值處理時很好用。

COALESCE 是做什麼的

COALESCE() 的用途很單純,就是從左到右找第一個不是 NULL 的值回傳。

例如:

1
select coalesce(null, null, 'A', 'B');

結果會是:

1
'A'

最常見的用法

1. 顯示預設值

1
2
select coalesce(nickname, '未設定') as nickname
from user_profile;

如果 nicknameNULL,就會顯示 未設定

2. 避免運算結果被 NULL 吃掉

1
2
select price * coalesce(quantity, 0) as total
from order_item;

如果 quantityNULL,至少不會整個運算結果也變 NULL

3. 多欄位擇一

1
2
select coalesce(cell_phone, home_phone, office_phone) as contact_phone
from customer;

這種在整理聯絡資訊時很好用。

跟 DB2 VALUE 的關係

我當初會想到這個,是因為 DB2 的 VALUE(xxx, ooo) 用法很像:

1
value(xxx, ooo)

如果 xxxNULL,就回傳後面的值。

COALESCE(xxx, ooo, zzz, fff, ...) 其實就是更通用的版本,可以一路往右找下去。所以如果你以前習慣 DB2 VALUE(),在 MySQL 記 COALESCE() 就很夠用了。

我自己的使用習慣

我通常會把 COALESCE() 用在查詢結果整理,不太會濫用在過度複雜的條件判斷裡。原因很簡單,太多層 COALESCE() 疊起來會讓 SQL 變得難讀。

如果只是單純要補預設值,它非常好用;但如果邏輯開始牽涉多種商業規則,還是建議拆清楚。

小提醒

  1. COALESCE() 判斷的是 NULL,不是空字串。
  2. 參數型別最好一致,不然 DB 可能會做型別轉換。
  3. 不要把所有髒資料都期待用 COALESCE() 一次解決。

參考來源

德瑞克:SQL Server 學習筆記: SQL Server:認識 COALESCE() 函數
IBM Knowledge Center - VALUE