【问题标题】:How can I do SQL JOIN by bitwise operator manipulation?如何通过按位运算符操作进行 SQL JOIN?
【发布时间】:2018-09-21 09:20:18
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    所以我们可以使用BitId & BitColurs 进行二进制计算,得到的结果大于0 意味着你可以得到值。

    【讨论】:

    • 当然,更好的解决方案是规范化数据库并添加一个partsToColors 表,但如果这是不可能的,你的答案是好的。
    • 它比真实数据复杂一点......我已经过度简化它来问这个问题
    • 你能解释一下 STUFF 和 ``XML PATH` 在这里做什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多