【发布时间】:2018-09-21 09:20:18
【问题描述】:
我们有一个包含两个表的SQL Server 2014 数据库:
在零件表中,BitColours 是一个按位数字,引用颜色表中的行。
我们被要求生成这样的查询:
我以前从未做过这种类型的操作,所以希望得到任何指导。
谢谢
【问题讨论】:
标签: sql sql-server tsql bit-manipulation sql-server-2014
我们有一个包含两个表的SQL Server 2014 数据库:
在零件表中,BitColours 是一个按位数字,引用颜色表中的行。
我们被要求生成这样的查询:
我以前从未做过这种类型的操作,所以希望得到任何指导。
谢谢
【问题讨论】:
标签: sql sql-server tsql bit-manipulation sql-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 位运算符将从两个值中比较两个二进制。
例如:
BitColor 是 3 = 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 意味着你可以得到值。
【讨论】:
STUFF 和 ``XML PATH` 在这里做什么吗?