SQL字符串比较忽略空格
此查询:SQL字符串比较忽略空格,sql,sql-server,string,tsql,sql-server-2008-r2,Sql,Sql Server,String,Tsql,Sql Server 2008 R2,此查询: SELECT CASE WHEN 'abc ' = 'abc' THEN 1 ELSE 0 END 返回1,即使“abc”显然不等于“abc”。同样地 SELECT CASE WHEN 'abc ' LIKE '%c' THEN 1 ELSE 0 END 也返回1。但是,一个非常类似的查询: SELECT * FROM #tempTable WHERE Name LIKE '%c' 未返回名称为'abc'的行 SQL Server 2008 R2,Windows 7&2008
SELECT CASE WHEN 'abc ' = 'abc' THEN 1 ELSE 0 END
返回1,即使“abc”显然不等于“abc”。同样地
SELECT CASE WHEN 'abc ' LIKE '%c' THEN 1 ELSE 0 END
也返回1。但是,一个非常类似的查询:
SELECT * FROM #tempTable WHERE Name LIKE '%c'
未返回名称为'abc'的行
SQL Server 2008 R2,Windows 7&2008 R2,x64。结果显示名称列是
NVARCHAR
(即使它只包含ASCII字符),并且NVARCHAR
的行为与VARCHAR
不同:
SELECT CASE WHEN N'abc ' LIKE 'abc' THEN 1 ELSE 0 END
返回0,与列相同,而不是文本。以下内容仍然返回1:
SELECT CASE WHEN N'abc ' = 'abc' THEN 1 ELSE 0 END
因此
=
和类似的工作方式不同,这是另一个特殊的区别。如果您需要以这种方式进行比较,但由于列的数据类型为VARCHAR而受到限制,类似的操作基本上会用“X”填充尾随空间,从而完成失败的比较:
DECLARE @1 VARCHAR(5), @2 VARCHAR(5)
SET @1 = 'ABC '
SET @2 = 'ABC'
IF REPLACE(@1,' ','X') = REPLACE(@2,' ','X')
PRINT 'Equal'
ELSE
PRINT 'Not Equal'
不是火箭科学,但至少是一个解决办法,如果你遇到类似的情况,你需要处理:)TA,我不知道你是如何通过简单地提到unicode(N)得到零的。我运行您的查询,它只给我1
您可以比较LEN('abc')和DATALENGTH('abc'),并根据需要使用它们,或者您可以用一些字符替换尾随空格来解决问题。=忽略尾随空格
len忽略培训空间
like不忽略尾随空格
SELECT CASE WHEN 'abc ' = 'abc' and DATALENGTH('abc ') = DATALENGTH('abc')
THEN 1 ELSE 0 END
您可以断言DATALENGTH不相关,但它仍然是解决方案。我在nvarchar列中遇到类似问题,希望修复数据,因此我执行了以下操作以查找数据
select 'x' + username + 'x' from aspnet_users
where 'x' + username + 'x' <> 'x' + rtrim(username) + 'x'
从aspnet\u用户中选择'x'+用户名+'x'
其中'x'+用户名+'x''x'+rtrim(用户名)+'x'
where子句将用户名原样与修剪后的版本进行比较
'x1234 x' <> 'x1234x'
'x1234 x''x1234x'
为了修复数据,我只是做了一个更新
update aspnet_Users
set username = rtrim(username)
where 'x' + username + 'x' <> 'x' + rtrim(username) + 'x'
更新aspnet\u用户
设置用户名=rtrim(用户名)
其中'x'+用户名+'x''x'+rtrim(用户名)+'x'
如果在我的机器上运行,它仍然返回1。请看一些实际发生的解释和进一步阅读。@Damien_不信者请看更新的答案。事实证明,=
和LIKE
的工作方式不同(对于没有掩码的同一操作数,如%
)。@Mr.TA是的,=
和LIKE
的工作方式不同,但这是有很好的文档记录的,并不奇怪。您可以说,像“abc”这样的“abc”返回1,但像“abc”这样的“abc”返回0,这是很奇怪的,但这也是众所周知的。@Mr.TA-是的,所以我回答时您的答案中的代码不正确,这与nvarchar
vsvarchar
无关,并且记录在我指向您的答案中的链接中。@GSerg肯定有些人很了解它,并且记录在某个地方,所述文档已被一些人阅读过。然而,并不是所有的人都知道所有的事情,因此这次问答的目的就是为了让我知道这一点。如果任何人都知道或记录在任何地方的问题不属于这里,请安排将其删除-连同本网站上所有其他问题的99.99%。好的建议,我有时会@x+'x'=@y+'x'
或LEN(@x+'x')
,我认为这比替换要快。请查看更新的答案。而且,LEN
和DATALENGTH
与我的平等问题没有直接关系。