SQL - 字符串比较忽略空格

时间:2014-08-14 14:46:34

标签: 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' 

没有返回Name ='abc'的行。

SQL Server 2008 R2,Windows 7& 2008 R2,x64。

5 个答案:

答案 0 :(得分:0)

原来,名称列为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

所以=LIKE的工作方式不同,这是另一个特殊的区别。

答案 1 :(得分:0)

如果你需要以这种方式比较事物,但因为你的列是数据类型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'

不是火箭科学,但如果你遇到类似需要处理的情况,至少可以解决这个问题:)

答案 2 :(得分:0)

TA,我不确定如何通过简单地提到unicode(N)来获得零。我运行你的查询,它只给我一个。

你可以比较LEN('abc')和DATALENGTH('abc')并根据你的要求使用它们,或者你可以用一些字符替换尾随空格来解决你的问题。

答案 3 :(得分:0)

=忽略尾随空格
len忽视训练空间
喜欢不会忽略尾随空格

SELECT CASE WHEN 'abc ' = 'abc' and DATALENGTH('abc ') =  DATALENGTH('abc') 
       THEN 1 ELSE 0 END

你可以声明DATALENGTH不相关但它仍然是解决方案。

答案 4 :(得分:0)

我在使用nvarchar列时遇到了类似的问题,想修复数据,因此我执行了以下操作来查找数据

select 'x' + username + 'x'  from aspnet_users 
where 'x' + username + 'x' <> 'x' + rtrim(username) + 'x' 

where子句将用户名与修剪后的版本进行比较

'x1234 x' <> 'x1234x'  

要修复数据,我刚刚进行了更新

update aspnet_Users
set username = rtrim(username)
where 'x' + username + 'x' <> 'x' + rtrim(username) + 'x'