首页 > 解决方案 > 无法比较 SQL Server 中的列

问题描述

我正在使用以下 SQL 代码来比较两nvarchar列。但代码显示不正确的结果:

SELECT 
    DP.NAME, DP.sid, SU.sid,
    CASE 
       WHEN DP.sid = SU.sid  
          THEN 'TRUE' 
          ELSE 'FALSE' 
    END AS DESDIREDRESULT
FROM 
    #SQLLOGINS DP
INNER JOIN 
    SYS.sysusers SU ON DP.name COLLATE DATABASE_DEFAULT = SU.name COLLATE DATABASE_DEFAULT

在代码中,我正在做一个临时表的内部连接,#SQLLOGINSsys.sysusers。此临时表包括NAMESIDsys.sqllogins

我面临一个问题,虽然两个 SID 相同,但在输出中应该是“真”。附上截图。但它返回 FALSE。

我不确定我在比较 SID 列时哪里错了。

在此处输入图像描述

标签: sqlsql-servertsqlazure-sql-database

解决方案


您正在混合类型。试试这个:

DECLARE @mockupTable TABLE(ID INT IDENTITY,SomeString VARCHAR(100),SomeBinary VARBINARY(100));

INSERT INTO @mockupTable VALUES('0x1234',0x1234);
INSERT INTO @mockupTable VALUES(0x6565,0x6565); --implicit cast!
INSERT INTO @mockupTable VALUES('ee', CAST('ee' AS VARBINARY(100))) --explicit cast!

SELECT *, CASE WHEN SomeString=SomeBinary THEN 'TRUE' ELSE 'FALSE' END FROM @mockupTable;

结果

+----+------------+------------+--------------------+
| ID | SomeString | SomeBinary |                    |
+----+------------+------------+--------------------+
| 1  | 0x1234     | 0x1234     | FALSE              |
+----+------------+------------+--------------------+
| 2  | ee         | 0x6565     | TRUE               |
+----+------------+------------+--------------------+
| 3  | ee         | 0x6565     | TRUE               |
+----+------------+------------+--------------------+

这里会发生什么?

第一行看起来一样,但不是,而 2 和 3 显然不同但返回它们是相同的?

原因:二进制值0x1234和字符串0x1234不一样,虽然看起来好像是一样的。

试试看SELECT CAST('0x1234' AS VARBINARY(100))。结果0x307831323334是——显然!- 不一样0x1234。它实际上是一个代码列表:30 (0), 78 (x), 31 (1), 32 (2), 33 (3), 34 (4)。

但是在第 2 行和第 3 行中,您可以看到,字符串的二进制值可以与真正的二进制值进行比较。这样做,您可以看到字符串ee有两个小写字母 e,ASCII 码为 65。所以0x6565转换为ee.


推荐阅读