我想写下面的查询:
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
。)
答案 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
字段上的索引几乎从不使用)EXISTS
,另一次用于CASE
)要写一些代码,但它不应该太糟糕。如果您要检查多个值,则可以始终在查询开头的JOIN
中封装较大的结果集(包含所有FILTER
和CTE
条件),然后在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