SQL - 字符串比较忽略空格

Mr.*_* TA 3 sql t-sql sql-server string sql-server-2008-r2

这个查询:

SELECT CASE WHEN 'abc ' = 'abc' THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)

返回 1,即使 'abc' 显然不等于 'abc'。相似地,

SELECT CASE WHEN 'abc ' LIKE '%c' THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)

也返回 1。但是,一个非常相似的查询:

SELECT * FROM #tempTable WHERE Name LIKE '%c' 
Run Code Online (Sandbox Code Playgroud)

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

SQL Server 2008 R2、Windows 7 和 2008 R2、x64。

pap*_*zzo 5

= 忽略尾随空格
len 忽略训练空间
就像不忽略尾随空格

SELECT CASE WHEN 'abc ' = 'abc' and DATALENGTH('abc ') =  DATALENGTH('abc') 
       THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)

您可以断言 DATALENGTH 不相关,但它仍然是解决方案。


Mr.*_* TA 2

事实证明,Name 列NVARCHAR(即使它只包含 ASCII 字符)并且NVARCHAR行为与以下不同VARCHAR

SELECT CASE WHEN N'abc ' LIKE 'abc' THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)

返回 0,与列而不是文字相同。以下代码仍然返回 1:

SELECT CASE WHEN N'abc ' = 'abc' THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)

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

附言。对于后代,这里有一些例子:

SELECT CASE WHEN N'abc ' LIKE 'abc' THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)

  • @Mr.TA - 是的,所以我回复时您的答案中的代码不正确,这与“nvarchar”与“varchar”无关,并且记录在我向您指出的答案中的链接中。 (2认同)