2013-07-17 33 views
2

真的很難找到一個好的標題。SQL - 從'1'的位置查找二進制表示形式

這裏是一個問題:我有一個SELECT查詢GROUP BY一個字段,它返回三個值(1,2,3)。這些值代表二進制數中'1'的位置。 換句話說:

Query Output |  Reult 
0,1,2   |  7 (111) 
1,2    |  6 (110) 
3    |  1 (001) 
-    |  0 (000) 

好吧,我知道這很容易。但是有兩個限制。首先,我想要一個不是函數/存儲過程的查詢。其次,結果應該是一個字符串(如'010')而不是數字。

我發現整數值的解決方案,而不是字符串(VARCHAR)

SELECT COALESCE(sum(power(2, field)), 0) AS test FROM (
    SELECT field FROM myTable GROUP BY field) a 

我使用SQL Server 2008中,以防萬一。

我也有這樣的解決方案,但是這個不能擴展到更大數量的輸出:

SELECT output = 
    CASE TEST 
    WHEN 0 THEN '000' 
    WHEN 1 THEN '001' 
    WHEN 2 THEN '010' 
    WHEN 3 THEN '011' 
    WHEN 4 THEN '100' 
    WHEN 5 THEN '101' 
    WHEN 6 THEN '110' 
    WHEN 7 THEN '111' 
    END 
    FROM(
    select COALESCE(sum(power(2, 3 - field)), 0) as test from (
    select field from myTable group by field) a) b 

回答

2

您可以使用二進制and和字符串連接:

select (case when test&4 > 0 then '1' else '0' end) + 
     (case when test&2 > 0 then '1' else '0' end) + 
     (case when test&1 > 0 then '1' else '0' end) 
from (select 6 as test) t; 

如果你是過敏case陳述,你可以這樣做:

select CHAR(ascii(0) + (test&4)/4) + 
     CHAR(ascii(0) + (test&2)/2) + 
     CHAR(ascii(0) + (test&1)/1) 
from (select 6 as test) t 
+0

這是一個很好的替代對於我的多個案例而言,但仍在尋找更好的可擴展解決方案。 –

相關問題