SQL根据二进制到十进制转换选择多行

时间:2013-11-12 08:46:18

标签: sql sql-server

对不起,标题有点模糊。

我继承了这样的表......

HG_ID | HG_Description
1     | Blue
2     | Red
4     | Green
8     | Yellow
16    | White
32    | Violet
64    | Black

该信息基于7位二进制,例如 0000001代表蓝色 0000011代表Blue + Red

我有另一个包含十进制等值的表。

0000001 = 1 in the second table
0000011 = 3 in the second table.

我的问题是,如果我在第二张表中有66,我不知道如何做一个在同一单元格中给我黑色和红色的选择语句。

我知道如何对每个表中显示相同的数字执行此操作,但在有多个选择时则不行。

我希望我已经明确表示这是我的第一篇文章。

谢谢。 MAL

1 个答案:

答案 0 :(得分:2)

您可以使用按位和运算符&从此表中获取相应的行。例如(SQL Fiddle):

DECLARE @colorValue int = 66

SELECT * 
FROM Table1
WHERE HG_ID & @colorValue = HG_ID

然后,您可以使用FOR XML PATH('')技巧来模拟MySQL的GROUP_CONCAT()函数,并将其缩小到一行(SQL Fiddle):

DECLARE @colorValue int = 66

SELECT STUFF(
    (SELECT ', ' + CAST(HG_Description AS VARCHAR(MAX)) 
     FROM Table1 
     WHERE HG_ID & @colorValue = HG_ID
     FOR XML PATH('')
    ), 1, 2, '')

您当然可以使用它从另一个表中进行选择。假设您有一个表Table2,其中包含以下内容:

CREATE TABLE Table2
    ([COLOR] int);

INSERT INTO Table2
    ([COLOR])
VALUES
    (66),
    (23),
    (49)
;

查询,从上面扩展,

SELECT Table2.COLOR AS id,
    STUFF(
    (SELECT ', ' + CAST(HG_Description AS VARCHAR(MAX)) 
     FROM Table1 
     WHERE HG_ID & Table2.COLOR = HG_ID
     FOR XML PATH('')
    ), 1, 2, '') AS Colors
FROM Table2

将产生以下结果(SQL Fiddle):

ID  COLORS
66  Red, Black
23  Blue, Red, Green, White
49  Blue, White, Violet