【发布时间】:2016-09-08 20:14:52
【问题描述】:
我正在尝试根据firstName 和lastName 列的连接来搜索表。这两个都定义为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