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