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

pyo*_*yon 73 sql t-sql sql-server

我想写下面的查询:

SELECT   ..., MIN(SomeBitField), ...
FROM     ...
WHERE    ...
GROUP BY ...
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT   ..., CAST(MIN(CAST(SomeBitField AS INT)) AS BIT), ...
FROM     ...
WHERE    ...
GROUP BY ...
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*her 144

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

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

  • @FranciscoSevilla我相信这是因为隐式优先级转换:https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-precedence-transact-sql?view=sql-服务器版本15 (2认同)
  • 想必又得被投回BIT吧?`CAST(MIN(SomeBitField+0) AS BIT)` (2认同)

JNK*_*JNK 30

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

SELECT CASE WHEN EXISTS (SELECT 1 FROM ....) THEN 1 ELSE 0 END AS 'MinBit'
FROM ...
WHERE ...
Run Code Online (Sandbox Code Playgroud)

这具有以下优点:

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

这是一个更多的代码写,但它不应该是可怕的.如果要检查多个值,则可以始终在查询开头将较大的结果集(包含所有JOINFILTER条件)封装在一起CTE,然后在CASE语句中引用它.

  • 如果它可以为空,那么`bit`有三个选项. (9认同)
  • 我必须是一个"较小"的程序员,但我希望看到`select 1 from ...`子查询的完整示例.它没有多大意义. (7认同)
  • @Vaccano - `SELECT 1 FROM Outertable WHERE bitfield = 1` (2认同)
  • 最初的问题包括GROUP BY。您需要在WHERE中包括按条件分组。 (2认同)

Isr*_*ies 6

此查询是最佳解决方案:

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

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


Wal*_*.K. 6

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

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

同样的结果


小智 6

select min(convert(int, somebitfield))
Run Code Online (Sandbox Code Playgroud)

或者如果您想保留结果

select convert(bit, min(convert(int, somebitfield)))
Run Code Online (Sandbox Code Playgroud)


Cha*_*ion 5

这一小段代码一直对我有用:

CONVERT(BIT, MIN(CONVERT(INT, BitField))) as BitField
Run Code Online (Sandbox Code Playgroud)