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

Storing multiple checkBox values in database field

我有一个数据库,它将多个复选框的值存储在由单个数字表示的单个字段中。每个复选框都分配了一个 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 中的 value 是 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;
}

要检查这些位是否已设置,您需要使用 & operator (Bitwise AND),如下所示:

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]