我正在使用SQL Server 2012 Express。我有一个1和0的字符串,长度为32位。
01010010000100010111001101110011
如何在SQL脚本中将其转换为带符号的十进制数?
目前我在网上使用网络工具作为我的答案,而我目前的搜索并没有引导我得到我需要的答案。
答案 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
我们可以将所有单独的十进制数相加以获得预期结果。 答案 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
。