2017-09-14 6 views
2

わからないLTRIM/RTRIM - ただし、最初と最後の文字がスペースの場合のみ?

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

これは私には無意味なようだ...私はこれを頼むことができます...しかし、私は、私たちのデータクレンジングのprocsの一つに、この全体に我々のシステムでは、いくつかのコードを通過して来たよ他にどこ

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がスペースを探しています。さらに、文字のグループを探すことができるという意味で、より強力です。そして、索引を使用できるようにすることもできます(この場合はそうではありませんが)。
列の元の値が同じであれば
+0

合意。そしてそれは私がそれを書く方法です...しかし、私はスペース、水平タブ、CRとLFにそれを展開するつもりです。 TRIM関数はスペースを削除するだけなので、置換を使用する必要があります。 – chadwin

+0

そして、このポストのために書式が変更されました。 procではすべて1行です。 – chadwin

1

このコードは、それには2005年より前のSQL Serverのバージョンのために書かれている可能性があるかもしれないが、Microsoftが実際に変更をスキップしupdateへの最適化を追加しました 新しいもの(つまり、実際の変更はありません)。 2000およびそれ以前のバージョンでは、影響を受ける行はすべて変更されたものとして扱われ、結果的にトランザクションログに記録され、膨大な量になっていました。

しかし、ゴードンがそれを指摘しているように、この場合でもオリジナルの著者は間違っています。 caseはすべての行をフィルタリングしないため、条件はWHEREに設定してください。そう、はい、あなたは正しいです、これはきれいにすることができます。

P.S.すでに2017バージョンの場合は、最終的にTRIM()機能が利用可能になります。これは実際にはltrim(rtrim())相当以上の機能です。

関連する問題