2017-09-14 52 views
2

不知道還有什麼地方我可以問這個......但我要通過在我們的系統中的一些代碼,並遇到了這個在我們的數據清洗的特效之一...LTRIM/RTRIM - 但只限於第一個/最後一個字符是空格嗎?

UPDATE #X SET 
    Email = CASE 
       WHEN LEFT(Email, 1) = ' ' OR RIGHT(Email, 1) = ' ' 
       THEN LTRIM(RTRIM(Email)) 
       ELSE Email 
      END 

這似乎毫無意義的我,並且不知道爲什麼它不只是寫爲:

UPDATE #X SET Email = LTRIM(RTRIM(Email)) 

有一些好處,我不知道的或可能一些數據問題,像一個隱式轉換錯誤或東西,它避免?這裏有很多不必要的代碼,我想開始清理。

它沒有明顯的時間節省。我運行統計IO和時間以及查詢計劃,它都是一樣的。

+0

只需要注意,在大多數排序規則中,尾部空格被忽略,用於歌劇比較 – scsimon

回答

4

這是毫無意義的,但出於不同的原因。它應該寫爲:

UPDATE #X 
    SET Email = LTRIM(RTRIM(Email)) 
    WHERE Email LIKE ' %' OR EMAIL LIKE '% '; 

如果值不會更改,沒有理由嘗試更新。

注:

  • SET真的應該走在哪裏值被設置的第一道防線。好的,這是一種美學觀點。
  • 我認爲LIKE在尋找空間上更加清晰。另外它更強大,因爲它可以查找字符組。而且,它可以是sargable,允許使用索引(儘管在這種情況下不是這樣)。
+0

同意。這就是我計劃編寫它的方法......但是,我將把它擴展到空間,水平製表符,CR和LF。由於TRIM函數僅刪除空格,因此必須使用Replace。 – chadwin

+0

是的,這個帖子的格式被改變了。在proc中,它全部是一行。 – chadwin

1

這可能是可能的,這種代碼前已經向2005年在它寫一個版本的SQL Server,微軟增加了一個優化update實際上跳過修改如果列原始值是相同的新的(即沒有做出實際改變)。在2000年和以前的版本中,所有受影響的行都被視爲已更改,因此將其放入事務日誌中,從而使其膨脹。然而,正如Gordon所指出的那樣,即使在這種情況下,原作者也錯了。該條件應該被放入WHERE,因爲case不會過濾任何行。所以是的,你是對的,這可以並且應該清理。

P.S.如果你已經在2017版本上,最終有TRIM()功能可用,這實際上遠遠不止是ltrim(rtrim())等效。

相關問題