T-SQL:将'0110'转换为6

时间:2009-01-02 09:07:19

标签: tsql

有没有什么好的方法可以将二进制(基数2)字符串转换为T-SQL中的整数(如果不是,我想我可以写一个函数......)

'0110'=> 6等。

4 个答案:

答案 0 :(得分:1)

你知道字符串总是特定的长度吗?如果是这样,你可以硬编码一堆子串/转换为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)))

如果语法略有偏离,请道歉。

令人不快,并且在更一般的情况下(你基本上需要以某种形式循环)不起作用,但它可能足以快速修复。

(如果downvoters可以请添加评论,我会非常感激.T-SQL有点超出我的专业领域 - 解释为什么这是一个坏主意比仅仅表达它 是一个坏主意。)

答案 1 :(得分:1)

看起来this function可以满足您的需求。 此外,这里看起来有an optimisation

我不知道任何可以在select语句中工作的内置函数,转换为二进制或varbinary没有帮助。

看起来你不会把它写成UDF或扩展存储过程(托管或本机)。

另一种选择可能是创建一个巨大的查找表并加入其中。你可能会获得比Sql函数更好的性能,我还没有测试过。我怀疑它会比扩展存储过程更好。

答案 2 :(得分:1)

Oki,这是第一次尝试和快速破解并试图解决这个问题。 它当然不是很漂亮,但可能会给你一些关于如何最好地解决问题的想法。

编辑:重新读取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'

希望这有帮助。

答案 3 :(得分:0)

我有一些模糊的HERE(StackOverflow),我在T-SQL中询问自定义的“基本”转换。

看看你得到什么建议会很有趣!