我有以下代码,它在最后一个语句中为"@B LIKE @A"
比较返回false。
我想知道为什么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'
答案 0 :(得分: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"
答案 1 :(得分:1)
@A的类型为CHAR(20),因此它的值在右侧用空格填充,以填充为20的长度。
Len()函数排除尾随空格,因此@A和@B都显示长度为1,即使@A已用空格填充。
为了进行比较,SQL Server遵循ansi标准,这些标准要求在比较之前将字符串填充到相同的长度,因此@A和@B显示为相等。
对此的一个例外是LIKE谓词,如果尾部空格在右侧,则不会将字符串填充到相同的长度。
答案 2 :(得分: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'