Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL字符串比较忽略空格_Sql_Sql Server_String_Tsql_Sql Server 2008 R2 - Fatal编程技术网

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
vs
varchar
无关,并且记录在我指向您的答案中的链接中。@GSerg肯定有些人很了解它,并且记录在某个地方,所述文档已被一些人阅读过。然而,并不是所有的人都知道所有的事情,因此这次问答的目的就是为了让我知道这一点。如果任何人都知道或记录在任何地方的问题不属于这里,请安排将其删除-连同本网站上所有其他问题的99.99%。好的建议,我有时会
@x+'x'=@y+'x'
LEN(@x+'x')
,我认为这比替换要快。请查看更新的答案。而且,
LEN
DATALENGTH
与我的平等问题没有直接关系。