if @str='a' @result=@result+'aaa' else if @str='b' @result=@result+'bbb' else if @str='c' @result=@result+'ccc'這勾起我的一段回憶,不過有點忘了原因,只記得因為那次的原因,讓我以後在寫 SQL 的 if...else 時,都一定會加上 begin...end
但現在想想,忘了原因卻還繼續堅持加上 if...else 的 begin...end 以後要求別人照做時似乎也站不住腳,因此決定追本朔源並整理出來。
首先,上述那樣的寫法並不會有問題,我當時出現的問題是發生在巢狀 if...else 之中,
declare @var int set @var=11 if @var <= 10 if @var <=3 print '<=3' else if @var <=6 print '<=6' else print '>6' else if @var <= 20 if @var <=13 print '<=13' else if @var <=16 print '<=16' else print '>16' print 'end' -- 執行結果: -- <=13 -- end如同上述的寫法,此功能完成後,其實也沒什麼事情,該跑到的結果都會跑到。
但如果哪天我不再需要'>6'的分支,是否將它刪掉就可以了呢?
答案是:
declare @var int set @var=11 if @var <= 10 if @var <=3 print '<=3' else if @var <=6 print '<=6' --else -- print '>6' else if @var <= 20 if @var <=13 print '<=13' else if @var <=16 print '<=16' else print '>16' print 'end' -- 執行結果: -- end「<=13 不見了!」,發生了什麼事?(是阿,那時在一千多行 SQL 碼的 Stored Procedure 裡跑不出某一段的結果,頭皮有麻了一下)
嗯~冷靜一下,再想想 if...else 的原理,其實這邊有個誤會。
"else if" 並不是一個正式的語法,後面的 if 只是 else 的一部分內容,我再把不需要'>6'分支的內容縮排整理一下:
declare @var int set @var=11 if @var <= 10 if @var <=3 print '<=3' else if @var <=6 print '<=6' --else -- print '>6' else if @var <= 20 if @var <=13 print '<=13' else if @var <=16 print '<=16' else print '>16' print 'end' -- 執行結果: -- end這樣應該就能理解為何 @var=11 跑不出 <=13 的原因了。
所以,再回到原來的問題,不再需要'>6'的分支時,該怎麼寫呢?
請明確的標示出 begin...end
declare @var int set @var=11 if @var <= 10 begin if @var <=3 print '<=3' else if @var <=6 print '<=6' --else -- print '>6' end else if @var <= 20 begin if @var <=13 print '<=13' else if @var <=16 print '<=16' else print '>16' end print 'end' -- 執行結果: -- <=13 -- end不過,我自己會全部標上 begin...end (一朝被蛇咬...
declare @var int set @var=11 if @var <= 10 begin if @var <=3 begin print '<=3' end else if @var <=6 begin print '<=6' end --else --begin -- print '>6' --end end else if @var <= 20 begin if @var <=13 begin print '<=13' end else if @var <=16 begin print '<=16' end else begin print '>16' end end print 'end' -- 執行結果: -- <=13 -- end以上,就是我那 if 必加 begin...end 的小小原因啦,
感謝捧場。
One More Thing ...
難道,C# 沒這個問題嗎?試試看...
int var=11; if (var <= 10) if (var <= 3) System.Diagnostics.Debug.Write("<=3"); else if (var <= 6) System.Diagnostics.Debug.Write("<=6"); else System.Diagnostics.Debug.Write(">6"); else if (var <= 20) if (var <= 13) System.Diagnostics.Debug.Write("<=13"); else if (var <= 16) System.Diagnostics.Debug.Write("<=16"); else System.Diagnostics.Debug.Write(">16");直接註解 '>6' 分支,
if (var <= 10) if (var <= 3) System.Diagnostics.Debug.Write("<=3"); else if (var <= 6) System.Diagnostics.Debug.Write("<=6"); //else // System.Diagnostics.Debug.Write(">6"); else if (var <= 20) if (var <= 13) System.Diagnostics.Debug.Write("<=13"); else if (var <= 16) System.Diagnostics.Debug.Write("<=16"); else System.Diagnostics.Debug.Write(">16");等等,Visual Studio 厲害的地方在於它會自動縮排,刪掉最後一個分號再重加分號,讓它排一下,
int var=11; if (var <= 10) if (var <= 3) System.Diagnostics.Debug.Write("<=3"); else if (var <= 6) System.Diagnostics.Debug.Write("<=6"); //else // System.Diagnostics.Debug.Write(">6"); else if (var <= 20) if (var <= 13) System.Diagnostics.Debug.Write("<=13"); else if (var <= 16) System.Diagnostics.Debug.Write("<=16"); else System.Diagnostics.Debug.Write(">16");看來,結果和 SQL 的相同,如果以同樣的寫法,哪天還是去只註解掉 '>6' 的那段,又沒有使用自動縮排,我想誤會還是會發生吧。
(想到之前有個同事說,他寫 C# 的 if 判斷式就算是只有單行的內容,還是堅持要加大括號。該不會是相同的原因吧?
沒有留言:
張貼留言