2017-09-14 25 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())等效。

相关问题