2012-06-14 160 views
0

你好我是SQL新手,我想使用Case語句。SQL中的案例陳述

我現在有這條SQL語句

update tblAccount set FullName = rtrim(isnull(FirstName,'')); 
update tblAccount set FullName = FullName + ' ' + rtrim(MI) 
where substring(reverse(MI),1,1)='.'; 
update tblAccount set FullName = FullName + ' ' + rtrim(MI) + '.' 
where substring(reverse(MI),1,1)!='.' 
and MI is not null and len(rtrim(MI)) = 1; 
update tblAccount set FullName = FullName + ' ' + rtrim(MI) 
where len(rtrim(MI)) >= 2; 
update tblAccount set FullName = FullName + ' ' + LastName; 
update tblAccount set FullName = FullName + ', ' + Suffix 
where Suffix is not null 
and len(rtrim(Suffix)) > 0; 

我想這個轉換成一些更小,更易於閱讀,有人告訴我一個Case語句可能會幫助,但我familar有了它,我在想,如果任何人都可以幫助將其轉換爲更具可讀性的內容。

+0

您使用的是SQL Server嗎?甲骨文? MySQL的?答案可能因此而異。 –

回答

2

可能被做成一個語句,但因爲你的代碼重新修改同一列,你將不得不嵌套和組合函數調用,這將是一個絕對巨大的聲明,因此遠不如當前可讀性碼。

另外,執行的順序很重要,所以維護和調試單個語句會困難得多。

保持原樣。你有什麼是好的。


關於性能,我可以說維護和明確的代碼每次都超過性能(只要性能是「可接受的」)。

也就是說,您當前的調用都需要全表掃描,其中作爲單個語句只需要一個。但是,根據表的大小,在第一次掃描之後,表可能會緩存在內存中,單個語句可能非常複雜,實際上比您當前的代碼慢。

您必須對其進行測試,但除非出現問題,否則不應考慮性能 - 不要提前優化代碼。

+0

我打算說和你一樣,但維護和調試會更簡單,但性能如何? –

+0

@Mr好點。我已經添加了筆記重新性能 – Bohemian

+0

是我看到的是,他的陳述中有6個完整的掃描,而不是一個,我將嘗試在一個聲明中做出來,讓我們看看它是如何可讀的xD –

0

的一般形式是

CASE WHEN <condition> THEN <value> ELSE <somethingElse> END 

哪裏WHEN <condition> THEN <value>可以重複和ELSE <somethingElse>是可選

case語句可以使用AA的控制結構,如在存儲過程中或一個腳本,或內聯,如在SELECT

你的更新語句是相同的:

UPDATE tblAccount SET FullName = 
    rtrim(isnull(FirstName,'')) 
    + CASE 
     WHEN substring(reverse(MI),1,1)='.' THEN ' ' + RTRIM(MI) 
      + CASE WHEN where len(rtrim(MI)) >= 2 THEN RTRIM(MI) END 
     WHEN MI is not null and len(rtrim(MI)) = 1 THEN rtrim(MI) + '.' 
      + CASE WHEN where len(rtrim(MI)) >= 2 THEN RTRIM(MI) END 
     ELSE 
      + CASE WHEN where len(rtrim(MI)) >= 2 THEN RTRIM(MI) END 
    END 
    + ' ' + LastName 
    + CASE 
     WHEN Suffix IS NOT NULL AND len(rtrim(Suffix)) > 0 THEN ', '+Suffix 
    END 

你有6次更新,NRS 1,5和6很簡單,他們幾乎複製到上面的一個聲明。 2的記錄更新不會被觸及3,並且4可以(根據您的代碼,數據可能會證明是另外的)發生2,3或不是,因此4的重複。


當然,我完全不同意這個論點,你的陳述很好。如果你需要的是一個更新,比做一個更新。並且不要通過接受不答覆來承擔壓力。

玩得開心!

查看COALESCE(),當你在學習的時候。

+0

你低估了我的回答(意思是「沒用」)?考慮一次性聲明的*可讀性,以及添加諸如修正大寫字母這樣的交叉切割的難度,在您的查詢中需要將該代碼添加到您的案例的每個分支。它一次性完成並不是可擴展的,也不是一個好主意。只是因爲你*可以*在代碼中做某件事,並不意味着你*應該* – Bohemian

+0

@Bohemian我的觀點是:僅僅因爲它*有點難*,並不意味着你不應該*嘗試*。看到我的評論。 至於可讀性,我沒有看到原始文件,另一個解決方案和一次性答案之間的任何差異,這些都不能用空格來解決。至於複雜性......所有Emre801需要更新一列,並結合其他條件。一步式解決方案更接近於此,因此不那麼複雜。 至於可伸縮性,這不是問題。你的最後兩條陳述有沒有什麼肉?'它只是不可擴展'*和*'也不是一個好主意'*? – jos

1

我會像這樣重寫它,只是性能上的一點提升,但我認爲它更具可讀性,就像你擁有它,就像@Bohemian說的那樣。

--MIDDLE NAME? 
    update tblAccount 
    set FullName = 
        case when substring(reverse(MI),1,1)='.' THEN -- FIRST + SECOND UPDATE 
         rtrim(isnull(FirstName,'')) + ' ' + rtrim(MI) 
        case when substring(reverse(MI),1,1)!='.' and MI is not null and len(rtrim(MI)) = 1 THEN --FIRST AND THIRD UPDATE 
         rtrim(isnull(FirstName,'')) + ' ' + rtrim(MI) + '.' 
        else -- FIRST UPDATE 
         rtrim(isnull(FirstName,'')); 
        end 

    GO  
    -- LASTNAME  
    update tblAccount 
    set FullName = case when len(rtrim(MI)) >= 2 THEN 
         (FullName + ' ' + rtrim(MI)) + ' ' + LastName 
        else 
         FullName + ' ' + LastName; 
        END 
    GO 

    -- SUFFIX 
    update tblAccount 
    set FullName = FullName + ', ' + Suffix 
    where Suffix is not null 
    and len(rtrim(Suffix)) > 0; 
+0

我同意舊的方式更具可讀性,我很好奇如何使用病例陳述,因爲我的朋友建議我這樣做。 – Emre801

+0

這一個可以幫助你?,我分裂了六個更新在3,爲可讀性,在步驟分裂,我不認爲你應該分裂它更多你認爲@bohemian –