LTRIM / RTRIM - 但只有在第一个/最后一个字符是空格的地方?

时间:2017-09-14 21:57:39

标签: sql sql-server tsql query-optimization

我不确定我能在哪里问这个...但是我在我们的系统中查看了一些代码并在我们的一个数据清理过程中遇到了这个...

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和时间以及查询计划,它们完全相同。

2 个答案:

答案 0 :(得分:4)

这是毫无意义的,但出于不同的原因。它应该写成:

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

如果值不会改变,则没有理由尝试更新。

注意:

  • SET应该真正进入设置值的第一行。好的,这是一种美学观点。
  • 我认为LIKE在寻找空间时更清楚。此外,它更强大,从某种意义上说它可以寻找一组字符。而且,它可以是sargable,允许使用索引(虽然不是在这种情况下)。

答案 1 :(得分:1)

此代码可能是为2005之前的SQL Server版本编写的。在其中,Microsoft已向update添加了一个优化,如果列的原始值与新的(即没有做出实际的改变)。在2000及以前的版本中,所有受影响的行都被视为已更改,因此被放入事务日志中,从而使其膨胀。

然而,正如戈登所指出的那样,即使在这种情况下,原作者也弄错了。条件应该放在WHERE中,因为case不会过滤任何行。所以是的,你是对的,这可以而且应该被清除。

P.S。如果您已经使用2017版本,那么最终可以使用TRIM()功能,这实际上不仅仅是ltrim(rtrim())等效功能。