SQL 检查位标志

问题描述 投票:0回答:3

因此应用程序具有带有位标记的复选框。根据选择的复选框选项,应用程序会将其作为整数存储在数据库中。如何查询数据库中的 int 以检查特定位是否打开/关闭。

示例:

Decimal   Binary
16        00010000
208       11010000

我想检查第五位是否打开或关闭(或任何与此相关的位)。

sql sql-server binary bit
3个回答
3
投票

SQL Server 没有位移运算符,但类似这样的操作可以:

where decimal & power(2,5-1) > 0

当然,使用位图会引发一个问题:为什么不只使用一组位标志呢?您可以单独定义每一个,并且代码更容易阅读。


0
投票

您可以在 SQL 中通过乘或除 2 来定义位移运算符

可以在此处找到执行此操作的存储过程示例: http://dataeducation.com/bitmask-handling-part-4-left-shift-and-right-shift/


0
投票

似乎对我有用的方法是......

DECLARE @Unknown AS int = 0;
DECLARE @Orange AS int = 1;
DECLARE @Big AS int = 2;
DECLARE @Green AS int = 4;
DECLARE @Small AS int = 8;

DECLARE @MYTABLE TABLE (
    id INT,
    name VARCHAR(50),
    description INT
);
INSERT INTO @MYTABLE (id, name, description) VALUES (1, 'item one', @Big + @Orange);
INSERT INTO @MYTABLE (id, name, description) VALUES (2, 'item two', @Small + @Orange);
INSERT INTO @MYTABLE (id, name, description) VALUES (3, 'item three', @Small + @Green);
INSERT INTO @MYTABLE (id, name, description) VALUES (4, 'item four', @Unknown + @Green);


SELECT TOP 1
(SELECT COUNT(*) FROM @MYTABLE WHERE (SELECT CASE description & @Small WHEN @Small THEN 1 WHEN 0 THEN 0 END) = 1) AS 'Small Items',
(SELECT COUNT(*) FROM @MYTABLE WHERE (SELECT CASE description & @Big WHEN @Big THEN 1 WHEN 0 THEN 0 END) = 1) AS 'Big Items'

DELETE @MYTABLE
© www.soinside.com 2019 - 2024. All rights reserved.