问题
How can I convert binary (base 2 stored as varchar) into decimal (base 10 stored as int or bigint) and the other way around, using T-SQL?
Example results:
7
(dec) <-->111
(bin)136
(dec) <-->10001000
(bin)2123942362
(dec) <-->1111110100110001100100111011010
(bin)
回答1:
This answer can handle bigint
Convert to bit(varchar containing 1 and 0)
DECLARE @input BIGINT = 9223372036854775807
;WITH N(N)AS
(
SELECT top 63
POWER(cast(2 as bigint),
ROW_NUMBER()over(ORDER BY (SELECT 1))-1)
FROM
(VALUES(1),(1),(1),(1))M(a),
(VALUES(1),(1),(1),(1))L(a),
(VALUES(1),(1),(1),(1))K(a)
)
SELECT
COALESCE
(
REVERSE
(
(
SELECT CAST(@input/N%2 as CHAR(1))
FROM N
WHERE N <= @input
for xml path(''), type
).value('.', 'varchar(max)')
)
, '0'
)
Result:
111111111111111111111111111111111111111111111111111111111111111
Convert varchar containing bit values to bigint
DECLARE @input varchar(max) =
'111111111111111111111111111111111111111111111111111111111111111'
;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)
Result:
9223372036854775807
回答2:
You could get integers from master.dbo.spt_values and use them as the weight for each digit.
use master;
declare @binary as varchar(max) = '1111110100110001100100111011010';
declare @decimal as int = 2123942362;
--binary --> decimal
select
@binary as binaryValue
, sum( substring(@binary,len(@binary)-position.number,1)
* power(2,position.number) ) as decimalValue
FROM dbo.spt_values AS position
WHERE position."type" = 'P' --integers
and position.number <= len(@binary)-1
;
--decimal --> binary
select
@decimal as decimalValue
, (
SELECT CAST(sign(@decimal & power(2,position.number)) as varchar(max))
FROM dbo.spt_values AS position
WHERE position."type" = 'P' --integers
and position.number <= isnull(LOG(nullif(@decimal,0),2),0)
order by position.number desc
FOR XML PATH(''),TYPE
).value('(./text())[1]','VARCHAR(8000)') as binaryValue
回答3:
You can create two functions as below and then create a wrapper function that would have a bit input to say which format are you trying to convert.
Converting binary to decimal
CREATE FUNCTION [dbo].[BinaryToDecimal]
(
@Input varchar(255)
)
RETURNS bigint
AS
BEGIN
DECLARE @Cnt tinyint = 1
DECLARE @Len tinyint = LEN(@Input)
DECLARE @Output bigint = CAST(SUBSTRING(@Input, @Len, 1) AS bigint)
WHILE(@Cnt < @Len) BEGIN
SET @Output = @Output + POWER(CAST(SUBSTRING(@Input, @Len - @Cnt, 1) * 2 AS bigint), @Cnt)
SET @Cnt = @Cnt + 1
END
RETURN @Output
END
Converting decimal to binary
CREATE FUNCTION [dbo].[DecimalToBinary]
(
@Input bigint
)
RETURNS varchar(255)
AS
BEGIN
DECLARE @Output varchar(255) = ''
WHILE @Input > 0 BEGIN
SET @Output = @Output + CAST((@Input % 2) AS varchar)
SET @Input = @Input / 2
END
RETURN REVERSE(@Output)
END
Hope this helps
来源:https://stackoverflow.com/questions/43736580/convert-decimal-binary-with-t-sql