2016-04-07 277 views
0

我正在进行在线SQL练习,并尝试将一系列整数转换为二进制数,而不是前导0.所使用的数据库引擎是MS SQL Server。在SQL Server中将整数转换为二进制格式

以下是原始表:

trip_no 
1100 
1101 
1123 
1124 
1145 
1146 
1181 
1182 
1187 
1188 
1195 
1196 
7771 
7772 
7773 
7774 
7775 
7776 
7777 
7778 
8881 
8882 

和正确的输出应该是这样的:

trip_no trip_no_bi 
1100  10001001100 
1101  10001001101 
1123  10001100011 
1124  10001100100 
1145  10001111001 
1146  10001111010 
1181  10010011101 
1182  10010011110 
1187  10010100011 
1188  10010100100 
1195  10010101011 
1196  10010101100 
7771  1111001011011 
7772  1111001011100 
7773  1111001011101 
7774  1111001011110 
7775  1111001011111 
7776  1111001100000 
7777  1111001100001 
7778  1111001100010 
8881  10001010110001 
8882  10001010110010 

我试图用cast((trip_no) as varbinary)语法,但结果却是怪异。例如,当我用cast()功能转换1100上锻炼的网页,它返回L,剩下的输出是这样的:

trip_no 
1100 L 
1101 M 
1123 c 
1124 d 
1145 y 
1146 z 
1181 ќ 
1182 ћ 
1187 Ј 
1188 ¤ 
1195 « 
1196 ¬ 
7771 [ 
7772 \ 
7773 ] 
7774 ^
7775 _ 
7776 ` 
7777 a 
7778 b 
8881 "± 
8882 "І 

而当我想这在MS SQL Server Management Studio中,它返回:

trip_no trip_no_bi 
1100  0x0000044C 
1101  0x0000044D 
1123  0x00000463 
1124  0x00000464 
1145  0x00000479 
1146  0x0000047A 
1181  0x0000049D 
1182  0x0000049E 
1187  0x000004A3 
1188  0x000004A4 
1195  0x000004AB 
1196  0x000004AC 
7771  0x00001E5B 
7772  0x00001E5C 
7773  0x00001E5D 
7774  0x00001E5E 
7775  0x00001E5F 
7776  0x00001E60 
7777  0x00001E61 
7778  0x00001E62 
8881  0x000022B1 
8882  0x000022B2 

我无法弄清楚这是怎么发生的。请帮忙。

与在这个环节要求的情况: SQL Server Convert integer to binary string

我没有要求的Cuz锻炼可重复使用的解决方案只允许一个步骤的解决方案...

由于问题提到期望的输出是its binary number representation (without leading zeroes),我想它是INTVARCHAR

也请忽略现在的领先0的东西,因为它很容易摆脱它。


我应该更清楚这个:看到了第一个答案之后,我意识到这个问题本质上是要求对一系列数字和字符串之间的转换,用公式来获得查询中的二进制数。我不认为它是要求二进制转换函数,但它要求“计算原始trip_no的二进制数,显示它并修剪前导0”。

+1

[SQL Server的整数转换成二进制字符串(HTTP的可能重复: //堆栈溢出。com/questions/127116/sql-server-convert-integer-to-binary-string) –

+0

这不是'前导零',它是Exadecimal的符号,前缀是“0x”。这里有两件事要记住:A)数据的实际数据类型B)SSMS对数据的可视表示。输出显示不指定数据类型 –

+0

您在链接中提供的#1解决方案提供了一个可执行的查询进行转换。但我想知道是否可以通过一个声明进行转换。第二个对于这个目的来说太复杂了。 @RickS – malamoji

回答

3

这里是做不使用功能的一个奇特的方式:

;WITH N(N)AS 
(SELECT 1 FROM(VALUES(1),(1),(1),(1),(1))M(N)), 
tally(N)AS(SELECT ROW_NUMBER()OVER(ORDER BY N.N)FROM N, N a) 

SELECT yourtable.num, x.bin 
FROM (values(0),(1),(2),(3),(4),(9),(20),(100),(1001)) yourtable(num) 
CROSS APPLY(
SELECT 
    REVERSE(( 
     SELECT cast(num/power(2, N - 1) % 2 as char(1)) 
     FROM tally t1 
     WHERE num >= power(2, N - 1) 

     for xml path(''), type 
    ).value('.', 'varchar(max)')) [bin] 
) x 

结果:

num bin 
0  NULL 
1  1 
2  10 
3  11 
4  100 
9  1001 
20 10100 
100 1100100 
1001 1111101001 
+0

。感谢分享,虽然我认为它需要我花些时间来消化您的解决方案。无论如何。 – malamoji

2

有点晚了,但这里的使用按位与另一种方法。每个位的值都是以字符串的形式计算的,然后将所有位的值连接在一起。最后,该字符串被转换为bigint以处置前导零。你可以包装这是另一个CAST将输出转换为一个字符串。

DECLARE @t TABLE (trip_no int); 

INSERT @t (trip_no) 
VALUES (1100),(1101),(1123),(1124),(1145),(1146),(1181),(1182), 
(1187),(1188),(1195),(1196),(7771),(7772),(7773),(7774),(7775), 
(7776),(7777),(7778),(8881),(8882); 

SELECT trip_no 
,CAST(CASE trip_no & 32768 WHEN 32768 THEN '1' ELSE '0' END 
+CASE trip_no & 16384 WHEN 16384 THEN '1' ELSE '0' END 
+CASE trip_no & 8192 WHEN 8192 THEN '1' ELSE '0' END 
+CASE trip_no & 4096 WHEN 4096 THEN '1' ELSE '0' END 
+CASE trip_no & 2048 WHEN 2048 THEN '1' ELSE '0' END 
+CASE trip_no & 1024 WHEN 1024 THEN '1' ELSE '0' END 
+CASE trip_no & 512 WHEN 512 THEN '1' ELSE '0' END 
+CASE trip_no & 256 WHEN 256 THEN '1' ELSE '0' END 
+CASE trip_no & 128 WHEN 128 THEN '1' ELSE '0' END 
+CASE trip_no & 64 WHEN 64 THEN '1' ELSE '0' END 
+CASE trip_no & 32 WHEN 32 THEN '1' ELSE '0' END 
+CASE trip_no & 16 WHEN 16 THEN '1' ELSE '0' END 
+CASE trip_no & 8 WHEN 8 THEN '1' ELSE '0' END 
+CASE trip_no & 4 WHEN 4 THEN '1' ELSE '0' END 
+CASE trip_no & 2 WHEN 2 THEN '1' ELSE '0' END 
+CASE trip_no & 1 WHEN 1 THEN '1' ELSE '0' END AS bigint) AS bin_value 
FROM @t; 

(阅读原帖所有的意见,这是非常类似于琐佩莱德提供的链接中的溶液)

相关问题