Sql Server - 在where子句中执行RTRIM / LTRIM的替代方法

时间:2012-04-11 19:05:41

标签: sql sql-server performance trim

我有一个名为varchar的列名

我想过滤名称为空字符串的所有结果...

 select name 
 from tblNames
 where name <> ''

我想做的是:

 select name 
 from tblNames
 where Ltrim(RTrim(name)) <> ''

我想在where子句中对名称应用trim,但我已经阅读了一些文章,提到了where子句中函数的性能问题

我想要一个解决方案,而不会影响性能

3 个答案:

答案 0 :(得分:13)

SQL-Server中的标准行为是

'      ' = ''

TRUE,因为尾随空格被忽略。来自MSDN support

  

SQL Server遵循ANSI / ISO SQL-92规范(第8.2节,一般规则#3),介绍如何将字符串与空格进行比较。 ANSI标准要求对比较中使用的字符串进行填充,以便在比较它们之前使它们的长度匹配。填充直接影响WHEREHAVING子句谓词以及其他Transact-SQL字符串比较的语义。例如,对于大多数比较操作,Transact-SQL认为字符串 'abc' 'abc ' 等效。 / p>      

此规则的唯一例外是LIKE谓词。 ...

因此,您的条件WHERE name <> ''应该可以正常工作,并且不包含任何只有空格的字符串。

答案 1 :(得分:4)

您可以制定一个约束,只有裁剪的数据才能进入该字段。

您可以在LTRIM(RTRIM(name))上制作索引。 SQL可能足够聪明,可以使用它。

您可以创建一个LTRIM(RTRIM(name))的计算字段,索引该字段,然后在查询中使用该字段。

答案 2 :(得分:3)

虽然

  

'abc' = 'abc '

(在equasion右边的字符串后面有空格)是TRUE

  

'abc' = ' abc'

(在equasion右边的字符串前面有空格)是FALSE

因此,自动忽略的仅是尾随空格(类似于RTRIM,但不像LTRIM)。