SQL根据二进制到十进制转换选择多行

标签 sql sql-server

抱歉,标题有点含糊。

我继承了这样一张表...

HG_ID | HG_Description
1     | Blue
2     | Red
4     | Green
8     | Yellow
16    | White
32    | Violet
64    | Black

信息基于 7 位二进制,例如 0000001代表蓝色 0000011代表蓝+红

我有另一个包含十进制等效值的表。

0000001 = 1 in the second table
0000011 = 3 in the second table.

我的问题是,如果我在第二个表中有 66,我不知道如何执行在同一单元格中给我黑色和红色的选择语句。

我知道如何对每个表格中出现相同的数字进行操作,但当有多个选择时我就不知道了。

我希望我已经明确表示这是我的第一篇文章。

谢谢。 马尔

最佳答案

您可以使用按位与运算符 & 从该表中获取适当的行。例如 ( SQL Fiddle ):

DECLARE @colorValue int = 66

SELECT * 
FROM Table1
WHERE HG_ID & @colorValue = HG_ID

然后您可以使用 FOR XML PATH('') 技巧来模拟 MySQL 的 GROUP_CONCAT() 函数并将其缩减为一行 ( SQL Fiddle ):

DECLARE @colorValue int = 66

SELECT STUFF(
    (SELECT ', ' + CAST(HG_Description AS VARCHAR(MAX)) 
     FROM Table1 
     WHERE HG_ID & @colorValue = HG_ID
     FOR XML PATH('')
    ), 1, 2, '')

您当然可以使用它从另一个表中进行选择。假设您有一个表 Table2,其中包含以下内容:

CREATE TABLE Table2
    ([COLOR] int);

INSERT INTO Table2
    ([COLOR])
VALUES
    (66),
    (23),
    (49)
;

从上面扩展的查询,

SELECT Table2.COLOR AS id,
    STUFF(
    (SELECT ', ' + CAST(HG_Description AS VARCHAR(MAX)) 
     FROM Table1 
     WHERE HG_ID & Table2.COLOR = HG_ID
     FOR XML PATH('')
    ), 1, 2, '') AS Colors
FROM Table2

将产生以下结果(SQL Fiddle):

ID  COLORS
66  Red, Black
23  Blue, Red, Green, White
49  Blue, White, Violet

关于SQL根据二进制到十进制转换选择多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19924593/

相关文章:

sql - 有什么方法可以获取 SQL Server 中打开/分配的游标列表吗?

php - 将日期传递给 where 子句时出错

php - 如何在 php 中创建如下所示的多维数组?

mysql - 在 Bluemix 应用程序上使用 Bluemix 的 SQL 数据库服务与 ClearDB MySQL 的优势

sql - 在 sql server 中使用虚拟数据在查询结果集中添加额外的行

SQL Server 2008 : how do I grant privileges to a username?

java - JDBC 异常 : Operation not allowed after ResultSet closed

php - 向存在于多个数据库中的表插入一个值

sql - SQL 查询中的条件Where 子句

sql - 如何在存储过程之间共享数据