网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > SQL技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.SQL Server 2008 的管理能力.
.快速掌握创建一个相同权限用户的.
.事务日志被填满的原因是什么?.
.SQL数据库中工作日如何计算(方法.
.最新分页存储过程(增加了选择字.
.在数据库日渐庞大时进行归档的解.
.SELECT查询的应用(二).
.Sql server优化50法.
.项目开发中层次结构存储的两种设.
.在Linux下访问MS SQL Server数据.
.TEMP表空间肆意扩大无法继续扩展.
.数据库查询结果的动态排序(1).
.使用JMail组件代替Sql Mail发送E.
.根据版本的不同整理所有的绿色SQ.
.在SQL Server2005中用语句创建数.
.SQL Server 2008在Vista下的问题.
.如何在把超过固定长度的文字以"….
.讲解无法打开用户默认数据库的解.
.从数据库中随机抽N条记录.
.解决物化视图刷新过程中的约束冲.

教你快速确定SQL Server栏中的最大值

发表日期:2008-8-6


你有一个里面包含整数、浮点数、金额或日期的N列SQL Server表,而你的任务是返回这些列中某一行的最大值。你甚至被要求一次求几行的最大值,返回一个记录组(record set)。


第一个任务暗示你可能预先不知道要比较哪一列或比较多少列,但事实并非总是如此。可能你恰恰知道你要比较哪些列,并且知道不可能增加任何新列。另一方面,你可能必须做好预防计划,预计到可能会增加一些新列。写一个刚好比较N个值的函数可以完成这个任务,但它在其它情况下又有多大用处呢?


假设下面是你的表:


CREATE TABLE [dbo].[MinMax](


[MinMaxID] [int] IDENTITY(1,1) NOT NULL,


[Value1] [int] NULL,


[Value2] [int] NULL,


[Value3] [int] NULL,


[Value4] [int] NULL,


CONSTRAINT [PK_MinMax]PRIMARY KEY CLUSTERED


(


[MinMaxID] ASC


)WITH (PAD_INDEX= OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]


) ON [PRIMARY]


注意,表定义允许在它的四个列中使用NULL值。在大多数情况下,我会尽量应用非NULL列,但在这种情况下,一个或几个日期列中很有可能包含NULL值;我当然不希望仅仅为了逃避非NULL问题而输入错误的数据。于是我把所有日期列定义为NULL列。图1给出了一些你可以插入表中的样本值。

 

对于简单Min()和Max()函数的作用,SQL有它自己的规定,即比较一个列中的值。既然没有内置函数来比较任何两个值并确定最大或最小值,你应该自行编写这种函数。我决定把它们叫做Min2()和Max2()。见列表A。


你可以用这个代码对它们进行测试:


SELECT dbo.Min2( 23, 34 )


SELECT dbo.Max2( 23,NULL)


SELECT dbo.Min2( NULL, 34 )


SELECT dbo.Max2( 23,NULL)


要比较原始表中的值,你可以简单地嵌入函数调用,就像这样:


SELECT dbo.Max2( Value1, dbo.Max2( Value2, dbo.Max2( Value3, Value4 ) ) )


FROM dbo.MinMax


根据原始表,这个调用的结果如下:


7


10


27


81


还是有一个问题:上面的代码把NULL转换成0。在Min2()函数中,这意味着如果有自变量为NULL值,则返回结果为0。在多数情况下,我认为这样做是恰当的,但在一些特殊情况下,你可能希望返回NULL而不是0。


你可能已经编写了一个刚好只接受四个参数的函数,但这样的函数过于特殊,不能在其它情况下使用。花一点时间考虑更普遍的情况,你将会得到更加有用的函数。

上一篇:个人经验总结:处理海量数据的经验和技巧 人气:959
下一篇:Oracle、SQL Server中如何锁定DB和解锁DB 人气:860
浏览全部SQL Server的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐