2012-02-29 2 views
0

Использование: SQL Server 2008 R2Pivot Integer Битовые значения в SQL

Моя цель состоит в том, чтобы принять заданное целое число (п) и выберите каждую перестановку чисел с п битами в 2 колонки, как показано ниже.

Given: n=4 

Output: 

ColA ColB 
0  0 
0  0 
0  0 
0  0 
1  0 
1  0 
1  0 
1  1 
2  0 
2  0 
2  1 
2  0 
3  0 
3  0 
3  1 
3  1 
... 
14 1 
14 1 
14 1 
14 0 
15 1 
15 1 
15 1 
15 1 

Выход делает не, повторите НЕ, должны быть заказаны, которые могут или не могут сделать это проще. Тем не менее, мне нужно уметь устанавливать n на любое целое число ... но ради времени выполнения, скажем, будет меньше 10.

Заранее спасибо.

ответ

1

Вы можете попробовать это:

declare @bits int 
set @bits = 4 

;with AllTheNumbers as (
    select cast (POWER(2, @Bits) as int) - 1 Number 
    union all 
    select Number - 1 
    from AllTheNumbers 
    where Number > 0 
), 
Bits as (
    select @Bits - 1 Bit 
    union all 
    select Bit - 1 
    from Bits 
    where Bit > 0 
) 
select *, case when (Number & cast (POWER(2, Bit) as int)) != 0 then 1 else 0 end 
from AllTheNumbers cross join Bits 
order by Number, Bit desc 

AllTheNumbers производит число от 0 до 2^п-1, биты производит битовые числа от 0 до @Bits - 1 и основная часть их связывает и вычисляет значение бит для каждой позиции.

+0

Работает отлично. Спасибо много. Довольно интеллигентный - мне придется немного налить его. –

0

Сообщите мне, если это нормально, когда вы говорите «биты», я предполагаю, что вы имеете в виду полномочия 2 - так что вы можете указать, какую мощность 2 вы хотите в инструкции set, и она вернет все перестановки.

DECLARE @Bit INT 
SET @Bit = 4 

;WITH NUMS AS (
SELECT TOP(POWER(2,@Bit)+1)ROW_NUMBER() OVER(ORDER BY sc.name) - 1 [N] 
FROM syscolumns sc 
) 

SELECT n1.N, n2.N 
FROM NUMS n1 
CROSS JOIN NUMS n2 
WHERE (n1.N + n2.N) <= POWER(2,@Bit) 
ORDER BY n1.N, n2.N