【问题标题】:Is there any reason why min and max not working on bit fields有什么理由为什么 min 和 max 不能在位域上工作
【发布时间】:2015-03-25 19:34:37
【问题描述】:

可能我遗漏了一些东西,但我仍然觉得奇怪,为什么不能在位字段上使用 maxmin 聚合。所以如果我尝试做这样的事情:

declare @temp table (data bit)

insert into @temp
select 1 union all
select 0

select max(data) from @temp

我会收到一个错误 Operand data type bit is invalid for max operator. 但如果我这样做:

declare @temp table (data bit)

insert into @temp
select 1 union all
select 0

select top 1 * from @temp order by data desc

它工作正常,因此 SQL Server知道如何对位字段进行排序。但是订购数据的可能性意味着我们可以获得最大值或最小值。 那么这个限制背后的原因是什么?

【问题讨论】:

  • 也许不是答案,但作为一种解决方法,您可以简单地使用CAST(Data AS TINYINT),这应该足够了,不是吗?
  • 是的,我当然知道解决方法:) 但我想知道为什么会有这种限制。以及它如何影响索引行为
  • 我想除了微软的人之外没有人知道原因。但根据this ticket 的说法,微软的唯一回答是“这是设计使然,我们没有任何计划在不久的将来在位列上实现聚合函数”
  • 这可能是最初设计中的一个疏忽,现在他们没有触及这一点。 SQL 团队在 v2 之后很少改进功能,除非有充分的理由。 T-SQL 语言投资也接近于零。
  • bit 数据类型有点精神分裂,因为它试图复制布尔值的一些语义。也许已经决定 MAX(true/false) 没有任何意义。但实际上它并不方便。

标签: sql sql-server


【解决方案1】:

除非我们可以从 SQL Server 团队获得一些内部信息,否则我们可能不得不接受有时答案只是“因为”。文档很清楚,例如 MIN 状态的 MSDN 页面;

MIN 可以与 numeric、char、varchar、uniqueidentifier 或 datetime 列,但不包含位列。

我的猜测(是的,我准备因为在 SO 答案中冒险猜测而被激怒!)是好处不会超过更改代码的风险。究竟有什么好处?

您不是第一个提出问题的人,但 MS Connect 上对 Aggregate functions on BIT columns: MIN and MAX 的回复表明它不太可能改变。

【讨论】:

  • “究竟有什么好处?”更干净的代码。返回没有双重 CAST 的正确数据类型的列。
猜你喜欢
  • 2017-09-22
  • 2012-08-26
  • 2020-10-12
  • 2014-09-03
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
相关资源
最近更新 更多