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

2012年3月27日 星期二

BigDecimal相除出現 Non-terminating decimal expansion

執行 BigDecimal的除法時遇到這個 exception:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
原因是使用了 BigDecimalA.divide(BigDecimalB).
除了分母外不帶任何引數的 divide如果遇到除以 0或除不盡就會拋 ArithmeticException.
所以 BigDecimal相除的時候還是乖乖用 divide(除數, 位數, 進位方法).

2012年3月12日 星期一

快速建立 java bean中所有 setter的小技巧

service寫多了,每次寫 form<->trasfer object或 transfer object<->entity的 set程式碼就很累,幾十甚至上百個欄位,就算 eclipse有 hint功能也很麻煩.

快速產生所有 setXXX();程式碼的方法:
1.把對象物件的所有 attribute複製到 notepad++
2.用 notepad++的行選取功能(按住 Alt後縱向選取)選取所有 attribute的第一個字
3.用 textFX Characters把選取的字母轉大寫
4.用 textFX Edit的 Insert (clipboard) through lines給所有行前面加上 ooo.set
5.把 ;用 ();取代
醬就可以產生所有欄位的 set程式碼,簡單快速又不會遺漏

2008年2月8日 星期五

rapidshare使用小訣竅

這陣子為了 great pianists,一直在用 rapidshare,用著用著,用出了些心得:
1.Hinet要 61.229開頭的 IP速度才會快,220.139跟 59.115開頭的慢得跟什麼一樣。
不過在 PM7:00 - PM11:00之間很容易拿到 220開頭的 IP。
2.用 Navigator這類回上一頁不會 refresh的瀏覽器可以反覆嘗試直到成功開始。
有些環境下,像是公司環境中,有多個對外 IP,或是有 cache server的時候,很容易發生 session invalid,就得不斷重來計時。
但是這時候其實是可以下的,此時 session並未逾時,只是因為不知名的原因導致 session invalid。
只要用 navigator或 opera這類回上一頁不會 refresh的瀏覽器就可以反覆嘗試直到成功開始。
如果打錯 CODE也可以上一頁重新輸入,省了計時的時間。
3.剛開始前幾K時,如果速度不理想,可以取消,選別台 SERVER直接再開始,不用重新計時。