Arrays T-SQL将INT转换为布尔数组
我有一个Arrays T-SQL将INT转换为布尔数组,arrays,sql-server,tsql,int,boolean,Arrays,Sql Server,Tsql,Int,Boolean,我有一个int类型数据(一个int数字,比如15)。要将其转换为5位布尔数组,它将变为[1,1,1,0] 我试过了 SELECT CAST(15 AS binary(5)) 但是我得到了一个十六进制值: 0x0000000F 我希望能够选择相应的位,所以它需要是一个布尔数组 感谢您的帮助两步过程:首先将Int转换为二进制流,然后将其转换为varchar,并在每个字符出现后添加零。 由于您总是希望长度为5,我也包括了该部分 这将帮助您: declare @intvalue int set @i
int
类型数据(一个int
数字,比如15)。要将其转换为5位布尔数组,它将变为[1,1,1,0]
我试过了
SELECT CAST(15 AS binary(5))
但是我得到了一个十六进制值:
0x0000000F
我希望能够选择相应的位,所以它需要是一个布尔数组
感谢您的帮助两步过程:首先将Int转换为二进制流,然后将其转换为varchar,并在每个字符出现后添加零。 由于您总是希望长度为5,我也包括了该部分 这将帮助您:
declare @intvalue int
set @intvalue=15
--Convert Int to Binary Stream
declare @result varchar(64)
declare @i int
select @i = 64, @result = ''
while @i>0
begin
select @result=convert(char(1), @intvalue % 2)+@result
select @intvalue = convert(int, (@intvalue / 2)), @i=@i-1
end
DECLARE @Char VARCHAR(800) = RIGHT(@result,5) --TRIM leading zeros and store binary stream as varchar (length of 5)
--Add comma(,) after every character
DECLARE @TotalChar INT = LEN(@Char)
DECLARE @Counter INT = @TotalChar
WHILE @Counter >= 1
BEGIN
IF @Counter % 1 = 0 AND @Counter + 1 <= @TotalChar
BEGIN
SET @Char = STUFF(@Char, @Counter + 1, 0, ', ')
END
SET @Counter = @Counter - 1
END
SELECT @Char --Final output
declare@intvalue int
设置@intvalue=15
--将Int转换为二进制流
声明@result varchar(64)
声明@i int
选择@i=64,@result=''
而@i>0
开始
选择@result=convert(字符(1),@intvalue%2)+@result
选择@intvalue=convert(int,(@intvalue/2)),@i=@i-1
结束
声明@Char VARCHAR(800)=RIGHT(@result,5)--修剪前导零并将二进制流存储为VARCHAR(长度为5)
--在每个字符后添加逗号(,)
声明@TotalChar INT=LEN(@Char)
声明@Counter INT=@TotalChar
而@Counter>=1
开始
如果@Counter%1=0和@Counter+1您可以尝试使用CTE进近:
declare @i int = 13
;with cte as(
select 0 [n], @i % 2 [bits], @i / 2 [int]
union all
select [n] + 1, [int] % 2, [int] / 2 from cte
where [int] / 2 > 0
), cte2 as (
select [n] [relevance], [bits] from cte
union all
select MAX([n]) + 1, 1 from cte
)
select * from cte2
--if you'd like to re-create number
--select sum(POWER(2, relevance) * bits) from cte2
这将导致talbe包含位。相关性根据n
列,最大的n
对应最相关(最左侧)位。SQL Server不是为逐位查询而构建的,但有:
如果您更经常地需要它,您可以创建一个位图表并将其保存在数据库中。不需要太多空间而且可能很帅
DECLARE @bitmaptable TABLE(BitNr INT,IntValue INT,Bitmap BINARY(4),InvertedBitMap BINARY(4));
WITH Numbers AS
(
SELECT TOP 33 CAST(ROW_NUMBER() OVER(ORDER BY (SELECT NULL))-1 AS bigint) AS Nr
FROM master..spt_values
)
INSERT INTO @bitmaptable(BitNr,IntValue,BitMap,InvertedBitMap)
SELECT CASE WHEN Nr=32 THEN -1 ELSE Nr END
,CAST(CAST(pwd2 AS BINARY(4)) AS int)
,CAST(pwd2 AS BINARY(4))
,pwd2 ^ 0xFFFFFFFF
FROM Numbers
CROSS APPLY(SELECT POWER(CAST(2 AS BIGINT),Nr) AS pwd2) AS A;
结果(最后一行-1
为未设置位图)
解决你的实际问题你可以这样做:
DECLARE @yourNumber INT=15
SELECT bm.BitNr
,CASE WHEN bm.Bitmap & @yourNumber>0 THEN 1 ELSE 0 END
FROM @bitmaptable AS bm
返回
0 1
1 1
2 1
3 1
4 0
5 0
6 0
7 0
你的问题不清楚。但我想你是在寻找可能的复制品
0 1
1 1
2 1
3 1
4 0
5 0
6 0
7 0