1

次のコードがあり"@B LIKE @A"、最後のステートメントで比較するためにfalseを返します。

私の知識によれば、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にスペースが埋め込まれていても、@Aと@Bの両方で長さが1になります。

比較のために、SQL Serverは、比較する前に同じ長さの文字列をパディングする必要があるansi標準に準拠しているため、@Aと@Bは等しいものとして表示されます。

これに対する1つの例外は、LIKE述語です。これは、末尾のスペースが右側にある場合、文字列を同じ長さにパディングしません。

参照:SQLServerが文字列と末尾のスペースを比較する方法

于 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 に答える