2016-04-07 4 views
0

Ich arbeite an einer Online-SQL-Übung und versuchen, eine Reihe von Ganzzahl in Binärzahlen ohne führende 0 zu konvertieren. Die Datenbank-Engine ist MS SQL Server.Konvertieren von Ganzzahl in Binärformat in SQL Server

Im Folgenden sind die Original-Tabellen:

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

Und die korrekte Ausgabe dies sein sollte:

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 

Ich versuchte cast((trip_no) as varbinary) Syntax zu verwenden, aber das Ergebnis ist seltsam. Zum Beispiel, wenn ich cast() Funktion 1100 auf die Ausübung Webseite konvertieren zurück es L, und die restlichen Ausgang war:

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 "І 

während, wenn ich dies in MS SQL Server Management Studio versucht, es wieder:

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 

Ich kann nicht herausfinden, wie das passiert ist. Bitte helfen Sie.

Im Gegensatz zur Situation in diesem Link gefragt: SQL Server Convert integer to binary string

Ich bin nicht nur für eine wiederverwendbare Lösung Cuz der Übung zu fragen erlaubt eine Ein-Schritt-Lösung ...

Da die Frage erwähnt, dass die gewünschte Ausgabe ist its binary number representation (without leading zeroes), ich denke, es ist entweder INT oder VARCHAR.

Auch ignorieren Sie bitte die führende 0 Sache als von jetzt, da es leicht ist, es loszuwerden.


ich dies klar gewesen sein sollte: nach der ersten Antwort da ich diese Frage realisierte im Wesentlichen für eine Reihe von Konvertierung zwischen Zahlen und Strings zu fragen, mit der Formel in der Abfrage binäre Zahl zu erhalten. Ich glaube nicht, dass es um eine binäre Konvertierungsfunktion geht, aber es fragt nach "Berechne die Binärzahl des ursprünglichen trip_no, präsentiere es und trimme die führende 0" herunter.

+1

Mögliches Duplikat [SQL integer Server Umrechnen in Binärkette] (http: //Paketüberfluss.com/questions/127116/sql-server-convert-integer-zu-binary-string) –

+0

das ist nicht eine führende Null, die Notation für Exadecimal ist und das Präfix ist "0x". Hier sind zwei Dinge zu beachten: A) der tatsächliche Datentyp Ihrer Daten, B) die visuelle Darstellung dieser Daten durch SSMS. Die Ausgabeanzeige gibt den Datentyp –

+0

nicht vor Die # 1 Lösung, die Sie in dem Link zur Verfügung stellten, gab eine ausführbare Abfrage zu dem Konvertieren an. Aber ich frage mich, ob es möglich ist, über eine Aussage zu konvertieren. Der zweite schien zu komplex für diesen Zweck. @RickS – malamoji

Antwort

3

Hier ist eine andere Art, es zu tun, ohne eine Funktion:

;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 

Ergebnis:

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

es funktioniert. Danke für das Teilen, obwohl ich denke, dass es mich irgendwann braucht, um deine Lösung zu verdauen. thx sowieso. – malamoji

2

Ein bisschen spät, aber hier ist ein weiterer Ansatz bitweise AND. Der Wert jedes Bits wird als eine Zeichenfolge berechnet, dann werden die Werte aller Bits zusammen verkettet. Schließlich wird die Zeichenfolge an einen bigint übergeben, um die führenden Nullen zu entsorgen. Sie könnten dies ein weiteres CAST umwandeln, um die Ausgabe in eine Zeichenfolge zu konvertieren.

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; 

(alle Kommentare auf dem Original-Beitrag Lesen, das ist sehr ähnlich zu der Lösung in dem von Zohar Peled angegebenen Link)