首页 > 解决方案 > 如何通过按位运算符操作进行 SQL JOIN?

问题描述

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

在此处输入图像描述

在此处输入图像描述

在零件表中,BitColours 是一个按位数字,引用颜色表中的行。

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

在此处输入图像描述

我以前从未做过这种类型的操作,所以希望得到任何指导。

谢谢

标签: sqlsql-servertsqlbit-manipulationsql-server-2014

解决方案


您可以尝试通过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 

结果

| 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)

所以我们可以用 BitId&BitColurs进行二进制计算,得到更大的结果0就可以得到值。


推荐阅读