code_prettify

2013年6月27日 星期四

SQL中某些 NESTED case when的 coalesce寫法

coalesce: 依序檢查並回傳運算式中第一個 not null的運算結果
ex. select coalesce(col1, col2, col3) from table1.
coalesce依序判斷 col1, col2, col3是否 not null. 若三者皆 not null, 回傳 col1.
這裡面其實已經隱含了 if else的架構,我們只需要適當的分析我們的條件套進去

例如:
select (case when col0<>0
  then col1
  else
    case when col00 is null
    then col2
    else col3
    end
  end
) as col
from EMPLOYEE_WRITE_OFF ewo
join EMPLOYEE_SALARY_DETAIL esd on esd.AUTO_ID=ewo.EMPLOYEE_SALARY_AUTO_ID

可以改寫成如下:
select
coalesce
(
 -- if
  case when col0<>0 then col1 else null end
 -- else
    -- if
  , case when col00 is null then col2 else null end
    -- else
  , case when col00 is not null then col3 else null end
) as col
from table1

至於哪一種比較方便或清楚
可以用 coalesce時個人是喜歡 coalesce.

寫的時候,兩種其實沒甚麼差別.
  就像那種超過 200行的 if else
  ( 就真接手過這種系統
    裡面幾乎所有的主要邏輯
    都有 200行以上的 if else(if), 噩夢)
  寫的時候都是逐步插進去的
  ( 最好是那種2 300行甚至高達 500多行的 if else
    會是 waterfall式地一氣呵成寫下來
    有能力在腦袋裡想完這 2 300行 if else
    為什麼不把時間用在將程式碼規畫好
    該抽出去的抽出去)
  寫起來沒啥難的
  被表到的是接手的人
--------------------------------
題外話: 
以前看混沌理論的介紹書的時候
介紹到科學家羅倫茲的時候
提過一段軼事
說研究生偷偷看了羅倫茲的程式碼
幾千行程式碼不分段落一氣呵成寫下來
望之如有字天書
用來烘襯羅倫茲的天才
寫程式讀程式的時候常會想起這個小故事
引以為 anti-pattern
關起門來愛怎麼搞怎麼搞
難以維護也是保護自己程式的方法之一(真這樣想的人大概不知道甚麼叫混淆器)
只要自己能維護就好
別人管不著
但是在 team work, 在企業環境中
這種人是不是天才有待考證
可以確定的稱號之一叫毒瘤

但如果是忘光後回來重看
我覺得 coalesce寫法我的呆瓜腦袋比較容易吸收:Q

沒有留言: