我想写以下查询:

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.)

推荐答案

因为BIT只有两个选项,所以只需使用 case 陈述:

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

这样做的好处是:

  • 不强制表扫描(BIT个字段上的索引几乎从未被使用)
  • 短路两次(EXISTS一次,CASE一次)

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

Sql相关问答推荐

删除与破折号(-)链接的相互重复的字符

为什么Postgrs Planner会在输出部分中显示我在查询中不使用的列?'""

如何将资源密集型自连接转换为更快的查询?

BigQuery`喜欢ANY‘和`不喜欢ANY’

我可以将INSERT语句与SELECT一起使用来创建条件吗?

SQL -滞后于上一个非重复值

如何在snowflake中进行SQL的反向填充

关于Postgres横向联接的谓词

Oracle中的时间戳

按连续相等值分组排序

在SQL查询中查找客户端的最短日期比较列和多行

使用多个WITH子查询的替代方法

无法访问级联删除导致的触发器中已删除的外键记录

在SQL中转换差异表的多列

PostgreSQL:从多个字段收集特定指标的最后一个条目

SQL 如何根据当前事件和下一个事件确定操作的持续时间?

MS ACCESS 错误插入 X(...) 从 A 联合 Select ... 从 B

SQL日期比较用例;月初至今的报告

如何在 RavenDB Studio (RQL) 中插入更新文档

PostgreSQL 中的递归树查询