1

我有以下代码,它返回 false 以"@B LIKE @A"在最后一个语句中进行比较。

我想知道为什么 Like 会以这种方式表现,因为据我所知 Like 是基于文本而不是基于数据类型的比较。

DECLARE @Var1 Char(20)
DECLARE @Var2 VarChar(20)

SET @Var1 = 'X'
SET @Var2 = 'X'

SELECT 
@Var1 AS A,
@Var2 AS B,
LEN(@Var1) AS 'A Length',
LEN(@Var2) AS 'B Length',
CASE WHEN @Var1 = @Var2 THEN 'Yes' ELSE 'No' END AS 'A = B',
CASE WHEN @Var1 LIKE @Var2 THEN 'Yes' ELSE 'No' END AS 'A LIKE B',
CASE WHEN @Var2 LIKE @Var1 THEN 'Yes' ELSE 'No' END AS 'B LIKE A'
4

3 回答 3

2

CHAR 值包含尾随空格,即使您看不到它们并且 LEN() 也不报告它们。

试试这个来验证:

DECLARE @Var1A Char(40) 
DECLARE @Var2A VarChar(40) 

SELECT @Var1A = @Var1 + 'x', @Var2A = @Var2 + 'x'

SELECT LEN(@Var1A), LEN(@Var2A), '"' + @Var1A + '"', '"' + @Var2A + '"'

21  2   "X                   x                   "  "Xx"
于 2012-05-09T09:20:28.360 回答
1

@A 是 CHAR(20) 类型,因此它的值在右侧用空格填充以将其填充到 20 的长度。

Len() 函数不包括尾随空格,因此 @A 和 @B 都显示长度为 1,即使 @A 已用空格填充。

对于比较,SQL Server 遵循 ansi 标准,该标准要求在比较之前将字符串填充到相同的长度,因此 @A 和 @B 显示为相等。

一个例外是 LIKE 谓词,如果尾随空格在右侧,它不会将字符串填充到相同的长度。

参考:SQL Server 如何将字符串与尾随空格进行比较

于 2012-05-10T06:33:34.460 回答
0

看一下这个

DECLARE @Var1 Char(20)
DECLARE @Var2 VarChar(20) 
 SET @Var1 = 'X' 
 SET @Var2 = 'X' 
  SELECT  
  @Var1 AS A,
   @Var2 AS B, 
   LEN(@Var1) AS 'A Length', 
   LEN(@Var2) AS 'B Length', 
   DataLength(@Var1) AS 'A DataLength', 
   DataLength(@Var2) AS 'B DataLength', 
   CASE WHEN @Var1 = @Var2 THEN 'Yes' ELSE 'No' END AS 'A = B', 
   CASE WHEN ltrim(rtrim(@Var1)) LIKE ltrim(rtrim(@Var2)) THEN 'Yes' ELSE 'No' END AS 'A LIKE B', 
   CASE WHEN ltrim(rtrim(@Var2)) LIKE ltrim(rtrim(@Var1)) THEN 'Yes' ELSE 'No' END AS 'B LIKE A' 
于 2012-05-23T09:00:14.460 回答