Sim*_*mon 1 sql t-sql sql-server bit-manipulation sql-server-2014
我们有一个SQL Server 2014包含两个表的数据库:
在Parts表中,BitColours是一个按位数,引用Colors表中的行.
我们被要求生成这样的查询:
我从来没有做过这种类型的操作,所以会很感激任何指导.
谢谢
您可以尝试通过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
Run Code Online (Sandbox Code Playgroud)
结果:
| id | part | colours |
|----|--------|-------------|
| 1 | abc123 | Red,Blue |
| 2 | xyt788 | Black,Green |
Run Code Online (Sandbox Code Playgroud)
说明
& AND按位运算符将比较两个二进制值.
例如 :
BitColor是3= 00011.
这是一个示例,我在二进制16之后忽略了很多零.
红色
00011
---------------------
(&) 00001 = Red (1)
---------------------
00001 = (1)
Run Code Online (Sandbox Code Playgroud)
蓝色
00011
---------------------
(&) 00010 = Blue (2)
---------------------
00010 = (2)
Run Code Online (Sandbox Code Playgroud)
黑色
00011
---------------------
(&) 00100 = Black (4)
---------------------
00000 = (0)
Run Code Online (Sandbox Code Playgroud)
绿色
00011
---------------------
(&) 01000 = Green (8)
---------------------
00000 = (0)
Run Code Online (Sandbox Code Playgroud)
所以我们可以使用 二进制计算BitId并BitColurs进行计算,得到更大的结果0意味着你可以得到这个值.