【问题标题】:Sql Server - Alternative of doing a RTRIM/LTRIM in the where clauseSql Server - 在 where 子句中执行 RTRIM/LTRIM 的替代方法
【发布时间】:2012-04-11 19:05:40
【问题描述】:

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

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

 select name 
 from tblNames
 where name <> ''

我想做的是:

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

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

我想要一个不影响性能的解决方案

【问题讨论】:

  • 要明确一点 - 你有没有只是空格的条目,即不仅仅是一个空字符串?
  • 它可以清空字符串以及空值和空格
  • 在内容方面有以下选项: 1. null 2. 空字符串 3. 仅空格 4. 带有可选空格的数据。如果您只想避免 1 和 2,您可以执行 where name &lt;&gt; '' and name is not null - 在某些设置中,这也会忽略 3。但是如果您想通过删除空格来明确避免 3,那么您可能需要一个函数。 where name &lt;&gt; '' 确实会忽略某些配置上的空值,因此可能就足够了
  • where name &lt;&gt; '' 不工作吗?
  • @abbas:那你没查?默认情况下,由空格组成的字符串匹配 SQL Server 中的空字符串,即'   ' = ''

标签: sql sql-server performance trim


【解决方案1】:

SQL-Server 中的标准行为是这样的

'      ' = ''

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

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

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

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

【讨论】:

    【解决方案2】:

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

    您可以在LTRIM(RTRIM(name)) 上创建索引。 SQL 可能足够聪明来使用它。

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

    【讨论】:

      【解决方案3】:

      虽然

      'abc' = 'abc '

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

      'abc' = ' abc'

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-12
        • 1970-01-01
        • 1970-01-01
        • 2011-05-07
        • 2015-10-26
        • 1970-01-01
        相关资源
        最近更新 更多