2016-04-07 272 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; 

(閱讀原帖所有的意見,這是非常類似於瑣佩萊德提供的鏈接中的溶液)

相關問題