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


82

我想编写以下查询:

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字段中位值的逻辑。)


2
@亚当·鲁宾逊:显然,Operand data type bit is invalid for min operator.
Andomar 2011年

4
不知道更优雅,但它有点短。cast(min(SomeBitField+0) as bit)
Mikael Eriksson

5
@Andomar:显然,如果您已经知道问题,是的,但是其他有类似问题的人也可以搜索错误消息,因此需要在问题中提供类似信息。
亚当·罗宾逊

Answers:


33

由于仅有两个选项BIT,因此只需使用case语句:

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

这具有以下优点:

  • 不强制进行表扫描(BIT几乎从未使用过字段索引)
  • TWICE短路(一次EXISTS又一次CASE

还要编写一些代码,但这并不可怕。如果您要检查多个值,则始终可以在查询开始时将较大的结果集(带有JOIN和和FILTER条件)封装CTE在中,然后在CASE语句中引用它。


10
bit如果可以为空,则有三个选项。
马丁·史密斯

1
如果该bit列完全由NULL值组成,MIN则应返回NULL
马丁·史密斯

8
我必须是一个“较小的”程序员,但是我希望看到一个完整的select 1 from ...子查询示例。这没有任何意义。
瓦卡诺2012年

2
@Vaccano -SELECT 1 FROM Outertable WHERE bitfield=1
JNK

2
最初的问题包括GROUP BY。您需要在WHERE中包含按条件分组。
Tmdean 2015年

156

一种选择是MIN(SomeBitField+0)。它读起来不错,噪音也少(我认为这很优雅)。

就是说,它比CASE选项更具破解性。而且我对速度/效率一无所知。


@Ben,非常感谢,这也对我的SQL查询有所帮助。
PatsonLeaner

@Ben,您是否有+0的文档?试图查找但未找到任何内容,仅供参考:)
Francisco Sevilla

1
@FranciscoSevilla我相信这是因为隐式转换优先的:docs.microsoft.com/en-us/sql/t-sql/data-types/...
本·莫舍

7

此查询是最佳解决方案:

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

当您添加BitField + 0时,它会自动变得像int


7
select min(convert(int, somebitfield))

或者如果您想保留结果

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

6

请尝试以下 注释: Min代表And聚合函数,Max代表Or聚合函数

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

同样的结果


5

这小段代码一直像魅力一样与我合作:

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

2

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

给一个模糊布尔值:

  • 1表示全部正确;

  • 0表示全为错误;

  • 在[0..1]之间的值表示部分匹配,并且可以是真值的某个百分比。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.