我得到了名为MultiTypes (int)的SQL和列。MultiyTypes列值是正则数字。我需要将这些数字分解成2种收藏品的功率,然后检查过滤值是否是这些收藏品中的一种。
如何正确构造我的WHERE语句?
示例:列具有值:
10 which is (8+2),
25 which is (16+8+1),
17 which is (16+1),
101 which is (64+32+4+1)
我想要构建查询
SELECT * FROM TABLE
WHERE @FilterValue -???-> MultiTypes
-?--意思是- @FilterValue是迭代值的“power of -2”收藏品之一。
如果筛选值为8,我将得到MultiTypes值为10和25的行(如果筛选值为1时),则将得到MultiTypes值为17、101和25的行。
发布于 2019-08-31 16:33:37
如果您想知道筛选值是否与"1“位置中的位数组匹配,则使用位-和。看上去:
where MultiType_Column & @filter = @filter
不需要将值分解为特定类型。
如果您想知道是否设置了任何值,则可以使用:
where MultiType_Column & @filter <> 0
发布于 2019-08-31 16:09:13
如果要基于type(k)
(2^k
)进行筛选,可以使用&
运算符:
SELECT *
FROM table_name
WHERE (MultiyType_Column & (POWER(2,k)) <> 0
上面的查询将获取所有具有type(k)
的行。例如,如果是k=3
,要获取所有具有type3
的行,可以执行以下操作:
SELECT *
FROM table_name
WHERE (MultiyType_Column & (POWER(2,3)) <> 0
发布于 2019-08-31 16:15:27
通常,要测试MultiTypes
是否匹配类型组合,例如Type2
+ Type4
我们做的,伪代码:
(MultiTypes <bit AND> (Type2 <bit OR> Type4)) == (Type2 <bit OR> Type4)
<bit AND>
、<bit OR>
是特定于sql产品的,请查看产品手册。
Sql-server演示
declare @multitype int = 128 + 16 + 1;
declare @test int = 128 + 1;
declare @test2 int = 64 + 1;
select 'Yes, @multitype includes all types of @test' res
where @multitype & @test = @test;
select 'this will not return any row' res2
where @multitype & @test2 = @test2;
https://stackoverflow.com/questions/57739533
复制相似问题