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选项更具攻击性.我对速度/效率一无所知.
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字段上的索引几乎从不使用)EXISTS又一次CASE)这是一个更多的代码写,但它不应该是可怕的.如果要检查多个值,则可以始终在查询开头将较大的结果集(包含所有JOIN和FILTER条件)封装在一起CTE,然后在CASE语句中引用它.
此查询是最佳解决方案:
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
请尝试以下 注意: 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)
这一小段代码一直对我有用:
CONVERT(BIT, MIN(CONVERT(INT, BitField))) as BitField
Run Code Online (Sandbox Code Playgroud)