使用SQL Server时必须注意的10个特性:MAX(BIT)

日期: 2013-09-16 作者:Alex Bolenok 来源:TechTarget中国

使用SQL Server时必须注意的10个特性:MAX(BIT) 

 

对于存储布尔值,SQL Server支持一个特殊数据类型,称之为BIT。但是,你不能在那些字段上聚合AND或是OR(通常这些是由MAX和MIN完成的)。

这一行为在标准中没有定义并且是特定于SQL Server的。

BIT数据类型是设计用来存储布尔值的。一条记录中的8位值用来存储到单个字节中,9到16位值存储到两个字节中等等,这使得此数据类型非常的具有存储效率。

但是,如果我们想要将那些值进行聚合,我们就会遇到如下错误:

CREATE TABLE

bitvalues

(

id INT NOT NULL PRIMARY KEY,

v1 BIT,

v2 BIT,

v3 BIT,

)

CREATE INDEX

ix_bitvalues_v1

ON bitvalues (v1)

CREATE INDEX

ix_bitvalues_v2

ON bitvalues (v2)

CREATE INDEX

ix_bitvalues_v3

ON bitvalues (v3)

INSERT

INTO bitvalues

VALUES (1, 0, 0, 1),

(2, 0, 1, 1)

SELECT MAX(v1), MAX(v2), MAX(v3),

MIN(v1), MIN(v2), MIN(v3)

FROM bitvalues

Operand data type bit is invalid for max operator.: SELECT MAX(v1), MAX(v2), MAX(v3), MIN(v1), MIN(v2), MIN(v3) FROM bitvalues

有一个简便的方法可以把它们转换为整形:

SELECT MAX(CAST(v1 AS INT)),

MAX(CAST(v2 AS INT)),

MAX(CAST(v3 AS INT)),

MIN(CAST(v1 AS INT)),

MIN(CAST(v2 AS INT)),

MIN(CAST(v3 AS INT))

FROM bitvalues

但是这会阻止索引的使用。

一个更为有效的方法是使用TOP 1 / ORDER BY替代MAX和MIN。与MAX和MIN不同,Ordering(排序)是作用于位的:

SELECT (

SELECT TOP 1

v1

FROM bitvalues

ORDER BY

v1 DESC

),

(

SELECT TOP 1

v2

FROM bitvalues

ORDER BY

v2 DESC

),

(

SELECT TOP 1

v3

FROM bitvalues

ORDER BY

v1 DESC

),

(

SELECT TOP 1

v1

FROM bitvalues

ORDER BY

v1

),

(

SELECT TOP 1

v2

FROM bitvalues

ORDER BY

v2

),

(

SELECT TOP 1

v3

FROM bitvalues

ORDER BY

v3

)

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐