如何对由标志bigint列设置的T-SQL进行分组

时间:2018-06-25 10:09:23

标签: c# linq tsql bitwise-operators

我正在一个项目中,搜索功能的效率至关重要。

我有几个标志列(如c#中的枚举标志)。搜索此数据的速度非常快(往返3毫秒),但是现在我要播种了,我必须执行组计数。

因此,我有一个包含红色(1),白色(8)和蓝色(64)的项目“ A”,因此“颜色”列中的数字为73。

要搜索,我可以用此搜索带有红色的项目

Declare @colour int
set @colour = 1

Select * 
From Items  
Where (Colour & @colour) > 0

那很好。现在我必须将其分组(也是超级快的)

因此,如果我总共有8个项目,其中5个包含红色,3个包含白色,7个包含蓝色,结果将如下所示:

Colour      Qty
------------------
1           5
8           3
64          7 ( I don't have to worry about the name )

所以:我有什么办法可以将数字73进行按位拆分?

(第2部分:如何将其转换为Linq to SQL?)

任何建议将不胜感激

谢谢^ _ ^

1 个答案:

答案 0 :(得分:0)

好的-我想我已经找到了最好的解决方案:

我尝试了使用cte的视图:

with cte as (
  select cast(1 as bigint) as flag, 1 pow
  union all
  select POWER(cast(2 as bigint),pow), pow + 1
  from cte
  where flag < POWER(cast(2 as bigint),62)
)
, cte2 as (
  select flag from cte
  union select -9223372036854775808
)

但是那太慢了,所以现在我把它做成一个静态表了。我加入一个按位的'&':

select Flag, Count(*)
From FlagValues fv 
inner join Items i on (fv.Flag & i.Colour)

快得多^ _ ^