将32位二进制字符串1和0转换为SQL Server中的有符号十进制数

时间:2015-09-27 03:49:14

标签: sql-server

我正在使用SQL Server 2012 Express。我有一个1和0的字符串,长度为32位。

01010010000100010111001101110011

如何在SQL脚本中将其转换为带符号的十进制数?

目前我在网上使用网络工具作为我的答案,而我目前的搜索并没有引导我得到我需要的答案。

4 个答案:

答案 0 :(得分:3)

如果使用Tally表,则可以使用单个T-SQL语句执行转换:

;WITH Tally(i) AS (
   SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS i
   FROM (VALUES (0), (0), (0), (0), (0), (0), (0), (0)) a(n)
   CROSS JOIN (VALUES (0), (0), (0), (0)) b(n)
)  
SELECT SUM(t.v) AS DecimalNumber 
FROM (
   SELECT POWER(CAST(SUBSTRING(x.d, i, 1) AS DECIMAL(10,0)) * 2, 32 - i)
   FROM (VALUES ('01010010000100010111001101110011')) x(d)
   CROSS JOIN Tally) AS t(v)

说明:

  • Tally是一个表格表达式,返回1-32的所有值。
  • 使用这些值,我们可以使用SUBSTRING从二进制字符串中提取每个数字。
  • 使用POWER数学函数,我们可以将每个单独的二进制数字转换为十进制数。
  • 使用SUM我们可以将所有单独的十进制数相加以获得预期结果。

Demo here

答案 1 :(得分:0)

你可以尝试如下 -

DECLARE @Binary VARCHAR(100) = '01010010000100010111001101110011';
DECLARE @characters CHAR(36),  
        @result BIGINT,  
        @index SMALLINT,  
        @base BIGINT;
SELECT @characters = '0123456789abcdefghijklmnopqrstuvwxyz',  
       @result = 0,  
       @index = 0,
       @base = 2;    
WHILE @index < LEN(@Binary)
BEGIN 
     SELECT @result = @result + POWER(@base, @index) * (CHARINDEX(SUBSTRING(@Binary, LEN(@Binary) - @index, 1), @characters) - 1);
     SET @index = @index + 1;  
END
SELECT @result;

这将帮助您从任何基础(我用二进制@base as 2)转换为基数10.从最右边开始并向左移动直到我们用完数字。转换是(base ^ index)*数字。

答案 2 :(得分:0)

我必须将此代码添加到Abhishek的代码示例的末尾,以获得我需要的签名号码。 DECLARE @MyNewExValue INT IF @result > 2147483647 BEGIN SET @result = @result - (2147483648 * 2) END SET @MyNewExValue = @result SELECT @MyNewExValue

答案 3 :(得分:0)

此解决方案适用于任何(bigint)长度的二进制字符串:

DECLARE @input varchar(max) = 
  '01010010000100010111001101110011'

;WITH N(V) AS 
(
  SELECT
    ROW_NUMBER()over(ORDER BY (SELECT 1))
  FROM
    (VALUES(1),(1),(1),(1))M(a),
    (VALUES(1),(1),(1),(1))L(a),
    (VALUES(1),(1),(1),(1))K(a)
)
SELECT SUM(SUBSTRING(REVERSE(@input),V,1)*POWER(CAST(2 as BIGINT), V-1))
FROM   N
WHERE  V <= LEN(@input)

source

应该注意,最受好评的solution above仅适用于长度为32位的二进制字符串,而字符串'00000000000000000000000000000000'返回1