我有一个名为varchar的列名
我想过滤名称为空字符串的所有结果...
select name
from tblNames
where name <> ''
我想做的是:
select name
from tblNames
where Ltrim(RTrim(name)) <> ''
我想在where子句中对名称应用trim,但我已经阅读了一些文章,提到了where子句中函数的性能问题
我想要一个解决方案,而不会影响性能
答案 0 :(得分:13)
SQL-Server中的标准行为是
' ' = ''
是TRUE
,因为尾随空格被忽略。来自MSDN support:
SQL Server遵循ANSI / ISO SQL-92规范(第8.2节,一般规则#3),介绍如何将字符串与空格进行比较。 ANSI标准要求对比较中使用的字符串进行填充,以便在比较它们之前使它们的长度匹配。填充直接影响
WHERE
和HAVING
子句谓词以及其他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
)。