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