此查询:
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。
答案 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)
你可以比较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'