5

我有一个列名,它是一个 varchar

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

 select name 
 from tblNames
 where name <> ''

我想做的是:

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

我想在 where 子句中对名称进行修剪,但我已经阅读了几篇文章,其中提到了 where 子句中函数的性能问题

我想在不影响性能的情况下解决这个问题

4

3 回答 3

13

SQL-Server 中的标准行为是

'      ' = ''

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

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

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

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

于 2012-04-11T19:40:47.747 回答
4

您可以做出一个约束,只允许修剪后的数据进入该字段。

你可以在LTRIM(RTRIM(name)). SQL 可能足够聪明来使用它。

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

于 2012-04-11T19:14:24.530 回答
3

尽管

'abc' = 'abc '

(等式右侧的字符串后有空格)是TRUE

'abc' = ' abc'

(等式右侧的字符串前有空格)是FALSE.

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

于 2016-09-08T15:44:29.807 回答