【问题标题】:Like operator and Trailing spaces in SQL ServerSQL Server 中的like 运算符和尾随空格
【发布时间】:2014-09-29 11:44:17
【问题描述】:

这个匹配column_name like 'CharEndsHere%'

和

这个不是column_name like 'CharEndsHere'

我知道like 运算符甚至会考虑尾随空格,所以我只是复制了精确列值(带有尾随空格)并粘贴它。

类似于column_name like 'CharEndsHere ' 但它不匹配 -- 为什么?。

我没有使用'=' 运算符,因为列类型是ntext

我这里有什么遗漏或者我不应该以这种方式使用like 运算符吗?

已编辑:column_name like 'CharEndsHere__'(__ 表示空格)'CharEndsHere ' 是该单元格中的确切值,以这种方式使用 like 是否有效?

编辑:

这是我试过的代码,

SELECT * 
FROM [DBName].[dbo].[TableName] 
WHERE [DBName].[dbo].[TableName].Address1 LIKE rtrim('4379 Susquehanna Trail S  ') 

我也试过不使用rtrim,结果还是一样

编辑:根据 Blindy 的回答,

If a comparison in a query is to return all rows with the string LIKE 'abc' (abc
without a space), all rows that start with abc and have zero or more trailing 
blanks are returned.

但在我的情况下,我查询了Like 'abc',并且有一个包含'abc '(with trailing spaces) 的单元格没有返回。这是我的实际问题

【问题讨论】:

  • 没有任何通配符(% 或 _)的 LIKE 将与 = 运算符完全相同!
  • @Mithrandir 是的,我在问题中也提到过。但是我在这里寻找的就像 'char__' 在不使用 % 的情况下匹配
  • 那么你应该在你的问题中说明这一点!您想以无法使用的方式使用 like 运算符。一直想要它,它不会像工作一样改变方式!
  • LIKE 很好 - 但您应该停止使用 NTEXT 数据类型!请改用NVARCHAR(MAX)。 NTEXT 很糟糕,许多字符串函数根本不起作用。对所有超长的 Unicode 字符串使用 NVARCHAR(MAX),你会没事的!
  • ntext、text 和 image 数据类型将在 SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用nvarchar(max)、varchar(max) 和varbinary(max)。 See details here

标签: sql sql-server sql-server-2008 sql-like ntext


【解决方案1】:

这是一个阅读文档的案例,这里说得很清楚:http://msdn.microsoft.com/en-us/library/ms179859.aspx

当您使用 LIKE 执行字符串比较时,模式字符串中的所有字符都是有意义的。这包括前导或尾随空格。如果查询中的比较是返回带有字符串 LIKE 'abc'(abc 后跟一个空格)的所有行,则不返回该列的值为 abc(没有空格的 abc)的行。但是,模式匹配的表达式中的尾随空格将被忽略。如果查询中的比较是返回带有字符串 LIKE 'abc'(abc 不带空格)的所有行,则返回所有以 abc 开头且结尾有零个或多个空格的行。

编辑:根据您的 cmets,您似乎正在寻找一种使用 like 而忽略尾随空格的方法。使用类似这样的东西:field like rtrim('abc ')。它仍将使用索引,因为rtrim() 是一个标量操作数,并且在查找阶段之前对其进行了评估。

【讨论】:

  • 这是有道理的。出于好奇,The only exception to this rule is the LIKE predicate. When the right side of a LIKE predicate expression features a value with a trailing space, SQL Server does not pad the two values to the same length before the comparison occurs. 是什么意思,可以在这里找到:How SQL Server Compares Strings with Trailing Spaces
  • 后者是= 的工作方式,它将两边填充到相同的长度,然后进行比较(有效地忽略两边的尾随空格)。这就是说like 不做任何填充,所以模式侧尾随空格很重要(虽然它仍然会丢弃测试值侧空格)。
  • 这是否意味着我可以使用 like 'value__'(__ 表示空格)来匹配值。
  • @Vignesh,这是一种模棱两可的说法。如果您希望空格很重要,只需使用普通的like。如果您希望它们不很重要,请先将模式传递给rtrim()。
  • @Blindy 空格很重要,但即使使用普通的 like 也不匹配,这就是我在这里问这个问题的真正原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
相关资源
最近更新 更多