sql - 如何通过按位运算符操作进行 SQL JOIN?
问题描述
我们有一个SQL Server 2014
包含两个表的数据库:
在零件表中,BitColours 是一个按位数字,引用颜色表中的行。
我们被要求生成这样的查询:
我以前从未做过这种类型的操作,所以希望得到任何指导。
谢谢
解决方案
您可以尝试通过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
就可以得到值。
推荐阅读
- java - SendGrid:找不到符号,com.sendgrid.Email 类。周末断了
- javascript - 如何从一组列表中向下滑动一个列表并单击关闭其他列表?
- python - 在python中构造重复的导入语句
- php - 使用 PHP 和 Jquery 更新动态 HTML 表
- c# - Sql 查询未从数据库中提取所需数据
- youtube - 通过 API 从 youtube 视频中获取系列播放列表
- elasticsearch - 向 Elasticsearch 添加相关数据(架构问题)
- java - ROOM 和 Retrofit 无法使用相同的型号
- javascript - JWT 身份验证和 woocommerce 密钥不能同时工作
- javascript - 在 parcel.js 中为已部署的网站添加 Autoprefixer 会破坏所有网站样式?