【问题标题】:LEN(firstName) + LEN(lastName) does not equal LEN(firstName + lastName)LEN(firstName) + LEN(lastName) 不等于 LEN(firstName + lastName)
【发布时间】:2016-09-08 20:14:52
【问题描述】:

我正在尝试根据firstNamelastName 列的连接来搜索表。这两个都定义为NVARCHAR(50) NOT NULL

查询有时无法找到匹配项,因为连接的列被额外的空格填充。这是查询:

SELECT firstName + lastName AS fullName, LEN(firstName) + LEN(lastName) AS realLength, LEN(firstName + lastName) AS concatLength FROM UsersTable

这是一张带有结果的图片:

这是怎么回事?我怎样才能避免多余的空间?如果我这样做SELECT RTRIM(firstName) + RTRIM(lastName) ...,我会得到正确的全名,没有多余的空格,但是使用RTRIM 太贵了,因为我的数据集非常大。这会让我认为问题在于数据本身,除了 LEN(firstName)LEN(RTRIM(firstName)) 相同

【问题讨论】:

  • 如果存储不是问题,为什么不将您正在搜索的值保留为它自己的计算列?
  • 当您将 2 个 varchar 值相加时,您将获得正确的填充空格。问题不在于您的代码,而在于您的数据。什么是正确的填充你的 varchars 是问题。
  • 我刚刚在一个大型数据集上尝试了您的查询,它给出了正确的答案。看你的截图;您的 fullName 列显示了名字和一堆空白。问题是您的数据,而不是查询。我敢打赌你的名字栏是(或曾经)VarChar,而不是NVarChar
  • 一劳永逸,修剪数据并更新;忘记在您需要的每个查询上编写 trim。并修复将记录放入其中的 UI 或逻辑。在插入此表之前删除空格
  • 两列都是NVARCHAR(50) NOT NULL;我已经验证过很多次了。存储是一个问题,有数百万行包含复制和其他数据流,所以我不能再添加两列(firstNameLastName,lastNameFirstName)。我可能需要计划停机时间和TRIM 这些

标签: sql sql-server


【解决方案1】:

FirstName 末尾有空格。很容易检查以下是否返回 4:

select len(N'abcd    ')

这是varchar() 数据类型和len() 的属性。当然,当您连接它们时,然后SQL Server 决定识别最后的空格。

此行为记录在documentation 的“备注”部分中:

备注

LEN 不包括尾随空格。如果这是一个问题,请考虑使用 DATALENGTH (Transact-SQL) 函数,它不会修剪字符串。如果 处理一个 unicode 字符串,DATALENGTH 将返回两倍的数字 的字符。

正如 cmets 建议的那样,您可以在连接它们之前ltrim()/rtrim() 这些值。或者,使用like

【讨论】:

  • 就是这个。我不知道LEN 排除了尾随空格,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多