T-SQL: преобразовать '0110' в 6 - PullRequest
2 голосов
/ 02 января 2009

Есть ли хороший способ преобразовать двоичные (основание 2) строки в целые числа в T-SQL (если нет, я думаю, я могу написать функцию ...)

'0110' => 6 и т. Д.

Ответы [ 4 ]

1 голос
/ 02 января 2009

Оки, ну это первая попытка и быстрый взлом и попытка решить эту проблему. Это, конечно, не красиво, но может дать вам некоторые идеи о том, как лучше всего решить проблему.

РЕДАКТИРОВАТЬ: просто перечитайте ответ sambo99 и отметьте ссылку на оптимизированную версию, указанную там. Я пропустил это, прежде чем ответить. Похоже, что это немного похоже, но этот годится до 63 бит, тогда как упомянутая ссылка хороша только до 31 бита, и будет взорвана, если вы попытаетесь передать его больше. Эта версия игнорирует все, что выше 63.

DECLARE @bin varchar(63)
DECLARE @origlen int
DECLARE @currlen int
DECLARE @tmp int
DECLARE @pwr bigint
DECLARE @dec bigint
DECLARE @val bigint

SET @pwr = 2
SET @dec = 0
SET @bin = '011111111111111111111111111111111' --Test Value

SET @bin = REVERSE(@bin)
SET @origlen = LEN(@bin)
SET @currlen = 0

WHILE(@currlen <> @origlen)
BEGIN
    SET @tmp = CONVERT(int, SUBSTRING(@bin, @currlen + 1, 1))

    IF (@tmp <> 0)
    BEGIN
        SET @val = @dec
        SET @dec = POWER(@pwr, @currlen)
        SET @val = @val + @dec
        Set @dec = @val
    END

    SET @currlen = @currlen + 1

END

SELECT @val as 'Result'

Надеюсь, это поможет.

1 голос
/ 02 января 2009

Похоже, эта функция делает то, что вам нужно. Кроме того, похоже, что оптимизация здесь.

Я не знаю ничего встроенного, которое будет работать в операторе select, приведение к двоичному или varbinary не поможет.

Похоже, вы застряли либо пишете это как UDF или расширенный хранимый процесс (управляемый или собственный)

Другим вариантом может быть создание огромной справочной таблицы и присоединение к ней. Возможно, вы получите лучшую производительность, чем функция Sql, я не проверял ее. Я сомневаюсь, что это будет работать лучше, чем расширенный хранимый процесс.

1 голос
/ 02 января 2009

Знаете ли вы, что строки всегда будут определенной длины? Если это так, вы можете жестко закодировать набор шагов Substring / convert-to-int / multiply. Хотя это было бы не совсем хорошо ...

РЕДАКТИРОВАТЬ: Чтобы дать немного больше деталей, предположим, вы знаете, что это будет длина 4, вы можете сделать:

SELECT (8 * CONVERT(int, SUBSTRING(@x, 1, 1)))
     + (4 * CONVERT(int, SUBSTRING(@x, 2, 1)))
     + (2 * CONVERT(int, SUBSTRING(@x, 3, 1)))
     + (1 * CONVERT(int, SUBSTRING(@x, 4, 1)))

Извиняюсь, если синтаксис немного отключен.

Неприятно, и не работает в более общем случае (где вам в основном нужно было бы зацикливаться в некоторой форме), но это может быть достаточно для быстрого исправления.

(Если бы нижестоящие пользователи могли добавить комментарии, это было бы очень признательно. T-SQL не входит в сферу моей компетенции - объяснения того, почему это плохая идея, гораздо полезнее, чем просто отрицательное подтверждение того, что она плохая идея.)

0 голосов
/ 02 января 2009

У меня было что-то неопределенно похожее ЗДЕСЬ (StackOverflow), где я спрашивал о настраиваемом «базовом» преобразовании в T-SQL.

Будет интересно посмотреть, какие предложения вы получите!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...