2016-04-07 4 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

Я не прошу для многократного использования решения ПОТОМУ упражнения позволяет лишь один шаг решения ...

Поскольку вопрос отметил, что желаемый результат равен its binary number representation (without leading zeroes), я думаю, это либо INT, либо VARCHAR.

Также, пожалуйста, игнорируйте ведущую вещь 0 прямо сейчас, так как ее легко избавиться.


Я должен был быть более ясно по этому вопросу: после просмотра первого ответа я понял, что это вопрос, по существу, прошу серию преобразования между числами и строками, с формулой для получения двоичного числа внутри запроса. Я не думаю, что он просит функцию двоичного преобразования, но он просит «Рассчитать двоичный номер оригинала trip_no, представить его и обрезать ведущее 0».

+1

Возможный дубликат [SQL Преобразовать сервера целого числа в двоичной строки] (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; 

(Чтение всех комментариев на исходное сообщение, это очень похоже на решение в связи, предоставленной Зоар Пелед)