SQL 聚合逻辑操作

SQL Aggregate logical operations

在 T-SQL 中有没有办法在不代表单个位的字段上使用逻辑条件进行聚合?

例如,给定此数据:

CREATE TABLE #Example       (category int, flags int)
INSERT INTO #Example VALUES (1,            1) -- Binary 0001
INSERT INTO #Example VALUES (1,            2) -- Binary 0010

我想要一个类似于以下内容的查询:

SELECT AND(flags) FROM #Example
GROUP BY Category
-- Expect the result to be 0 because 0001 AND 0010 = 0000

SELECT OR(flags) FROM #Example
GROUP BY Category
-- Expect the result to be 3 because 0010 OR 0001 = 0011

在单个位字段上,我知道您可以转换为 int,然后使用 max 和 min,但这只适用于单个位值,因此不能解决问题。

SQL服务器没有这样的聚合函数。您可以使用 SQLCLR 创建一个。

但一个更简单的选择是拆分出每个位并单独聚合,然后将它们加回去。

对于OR

SELECT
  MAX(flags & 1) +
  MAX(flags & 2) +
  MAX(flags & 4) +
  MAX(flags & 8)
FROM #Example
GROUP BY Category

对于AND

SELECT
  MIN(flags & 1) +
  MIN(flags & 2) +
  MIN(flags & 4) +
  MIN(flags & 8)
FROM #Example
GROUP BY Category

db<>fiddle