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
在 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