如何通过按位运算符操作进行SQL JOIN?

时间:2018-09-21 09:20:18

标签: sql sql-server tsql bit-manipulation sql-server-2014

我们有一个SQL Server 2014数据库,其中包含两个表:

enter image description here

enter image description here

在“零件”表中,BitColours是按位数字,引用了“颜色”表中的行。

我们被要求产生这样的查询:

enter image description here

我以前从未做过这种类型的操作,因此不胜感激任何指导。

谢谢

1 个答案:

答案 0 :(得分:6)

您可以尝试通过AND按位运算符(&)连接两个表。

查询1

SELECT
    p.id,
    p.part,
     STUFF((
          SELECT ',' + c.Colour
          FROM colours c
          WHERE c.BitId & p.BitColurs > 0
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') colours
FROM parts p 

Results

| id |   part |     colours |
|----|--------|-------------|
|  1 | abc123 |    Red,Blue |
|  2 | xyt788 | Black,Green |

说明

& AND按位运算符将从两个值中比较两个二进制。

例如:

BitColor3 = 00011

这是一个示例,在二进制16之后,我忽略了很多零。

红色

    00011
---------------------
(&) 00001 = Red (1)
---------------------
    00001 = (1)

蓝色

    00011
---------------------
(&) 00010 = Blue (2)
---------------------
    00010 = (2)

黑色

    00011
---------------------
(&) 00100 = Black (4)
---------------------
    00000 = (0)

绿色

    00011
---------------------
(&) 01000 = Green (8)
---------------------
    00000 = (0)

因此,我们可以使用BitIdBitColurs通过二进制进行计算,并得到大于0的结果,即您可以获取该值。