将MIN聚合函数应用于BIT字段

时间:2011-08-09 14:24:29

标签: sql sql-server tsql

我想写下面的查询:

SELECT   ..., MIN(SomeBitField), ...
FROM     ...
WHERE    ...
GROUP BY ...

问题是, SQL Server不喜欢它,当我想计算位字段的最小值时,它返回错误Operand data type bit is invalid for min operator

我可以使用以下解决方法:

SELECT   ..., CAST(MIN(CAST(SomeBitField AS INT)) AS BIT), ...
FROM     ...
WHERE    ...
GROUP BY ...

但是,有更优雅的东西吗? (例如,可能存在一个我不知道的聚合函数,它会计算字段中位值的逻辑and。)

7 个答案:

答案 0 :(得分:125)

一个选项是MIN(SomeBitField+0)。它读得很好,噪音较小(我认为它很优雅)。

那就是说,它比CASE选项更具攻击性。我对速度/效率一无所知。

答案 1 :(得分:30)

由于BIT只有两个选项,只需使用案例陈述:

SELECT CASE WHEN EXISTS (SELECT 1 FROM ....) THEN 1 ELSE 0 END AS 'MinBit'
FROM ...
WHERE ...

这有以下优点:

  • 不强制进行表扫描(BIT字段上的索引几乎从不使用)
  • 短路TWICE(一次用于EXISTS,另一次用于CASE

要写一些代码,但它不应该太糟糕。如果您要检查多个值,则可以始终在查询开头的JOIN中封装较大的结果集(包含所有FILTERCTE条件),然后在CASE陈述。

答案 2 :(得分:6)

此查询是最佳解决方案:

SELECT CASE WHEN MIN(BitField+0) = 1 THEN 'True' ELSE 'False' END AS MyColumn
 FROM MyTable

当你添加BitField + 0时,它会自动变成int

答案 3 :(得分:6)

尝试以下方法 注意: Min表示和聚合函数,Max表示或聚合函数

SELECT   ..., MIN(case when SomeBitField=1 then 1 else 0 end), MIN(SomeBitField+0)...
FROM     ...
WHERE    ...
GROUP BY ...

相同的结果

答案 4 :(得分:5)

select min(convert(int, somebitfield))

或者如果您想将结果保留为位

select convert(bit, min(convert(int, somebitfield)))

答案 5 :(得分:2)

AVG(CAST(boolean_column AS FLOAT))OVER(...)AS BOOLEAN_AGGREGATE

给出模糊布尔值:

  • 1表示全部为True;

  • 0表示全部为假;

  • 介于0..1之间的值[表示部分匹配,可以是事实的一定百分比。

答案 6 :(得分:2)

这段小代码一直像我一样迷人:

CONVERT(BIT, MIN(CONVERT(INT, BitField))) as BitField