sql - 无法比较 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
在代码中,我正在做一个临时表的内部连接,#SQLLOGINS
,sys.sysusers
。此临时表包括NAME
和SID
。sys.sqllogins
我面临一个问题,虽然两个 SID 相同,但在输出中应该是“真”。附上截图。但它返回 FALSE。
我不确定我在比较 SID 列时哪里错了。
解决方案
您正在混合类型。试试这个:
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
.
推荐阅读
- r - Remove rows using another subset data frame
- ios - Fetching a relationship from core data swift 4
- android - Is it good practice use Progress Dialog As Singleton Class
- javascript - React infinite scroll- double scrollbars showing- I only want the window scroll bar
- python - How to convert dict value to a float
- javascript - Javascript es2015 import syntax
- c# - how to open mysql connection correctly?
- javascript - 如何为 angularjs 应用 webpack?
- qt - 使用 Qt 使用 OpenSSL 手动加密数据
- r - ggplot : 使用带有 aes(x = ..., y = ...) 的变量