Sql 在数据库字段中存储多个复选框值

Sql 在数据库字段中存储多个复选框值,sql,binary,Sql,Binary,我有一个数据库,它将多个复选框的值存储在一个由单个数字表示的单个字段中。每个复选框都指定了一个2的幂的值。例如,第一个复选框被指定为1、2、4、8、16和32。因此,如果选中第一、第二和第三个复选框,则值将为7。没有其他组合可以创建7,因此我们知道前3个复选框已选中 我的问题是,我可以在纸上计算出哪些框被选中,但我无法计算出如何在SQL中完成这一操作。我需要取一个数字,比如63,然后根据2的幂计算出前端选中了哪些复选框。希望这是有意义的。谢谢您确实需要使用二进制运算符,但可能在UI前端而不是SQ

我有一个数据库,它将多个复选框的值存储在一个由单个数字表示的单个字段中。每个复选框都指定了一个2的幂的值。例如,第一个复选框被指定为1、2、4、8、16和32。因此,如果选中第一、第二和第三个复选框,则值将为7。没有其他组合可以创建7,因此我们知道前3个复选框已选中


我的问题是,我可以在纸上计算出哪些框被选中,但我无法计算出如何在SQL中完成这一操作。我需要取一个数字,比如63,然后根据2的幂计算出前端选中了哪些复选框。希望这是有意义的。谢谢

您确实需要使用二进制运算符,但可能在UI前端而不是SQL中

即使在sql中,您也可以执行二进制操作

例如,在C中定义常量

enum checkbox {
     check_1 = 1,
     check_2 = 2,
     check_3 = 4,
     check_4 = 8,
     check_5 = 16,
     check_6 = 32,
     check_7 = 64,
     check_8 = 128
}
所以,如果sql中的值为63,则为

if (value & checkbox.check_1 == 1) {
    checkbox1.checked = true;
}
if (value & checkbox.check_2 == 1) {
    checkbox2.checked = true;
}
...
...
if (value & checkbox.check_8 == 1 ) {
    checkbox8.checked = true;
}

要检查这些位是否已设置,您需要使用,如下所示:

DECLARE @Value      INT = 63
;WITH   Sequence    AS
(
    SELECT      0 as Number UNION ALL
    SELECT      Number + 1
    FROM        Sequence
    WHERE       Number < 30
)
SELECT          Number,
                POWER(2, Number) [Power], 
                CASE    WHEN @Value & POWER(2, Number) = 0
                        THEN 0
                        ELSE 1
                END     [IsBitSet?] 
FROM            Sequence
或者,对于另一种可视化:

DECLARE @Value      INT = 63
;WITH   Sequence    AS
(
    SELECT  0 as Number UNION ALL
    SELECT  Number + 1
    FROM    Sequence
    WHERE   Number < 30
)
SELECT      *
FROM
(
    SELECT  Number,
            CASE    WHEN @Value & POWER(2, Number) = 0
                    THEN 0
                    ELSE 1
            END     [IsBitSet?] 
    FROM    Sequence
)   AS      [Source]
PIVOT
(
    MAX     ([IsBitSet?])
    FOR     Number IN
    (
            [00], [01], [02], [03], [04], [05], [06], [07],
            [08], [09], [10], [11], [12], [13], [14], [15],
            [16], [17], [18], [19], [20], [21], [22], [23],
            [24], [25], [26], [27], [28], [29], [30]
    )
)   AS      [Pivot]

您的问题是由于在一个字段中存储多个值而引起的,那么为什么不使用多个字段呢?这些字段在c中看起来不像常量,并且按位运算符不能直接转换为布尔结果。@RubensFarias是的,很抱歉。有点匆忙,做了一件邋遢的工作:。现在就修好了。