2012-02-29 55 views
0

使用:SQL Server 2008 R2的樞軸整數按位值在SQL

我的目標是拿一個給定的整數(N),並選擇在2列n位整數的每一個排列,如下圖所示。

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^N-1,位從0到@Bits產生的比特數生成數字 - 1,主體部分連接它們並計算每個位置的位值。

+0

完美地工作。非常感謝。相當聰明 - 我必須傾注一點。 – 2012-03-01 13:56:45

0

讓我知道如果這是好的,當你說'位'我假設你的意思是2的權力 - 所以你可以指定你想要在set語句中的2的權力,它會返回所有的排列。

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