数据库查询结果的动态排序(6)

动态|排序|数据|数据库

 现在,如果我们用任意三个列名字之一作为参数调用存储过程,存储过程都能够正确地返回结果。Richard Romley提出了一种巧妙的处理方法,如Listing 6所示。它不再要求我们搞清楚可能涉及的列数据类型。这种方法把ORDER BY子句分成三个独立的CASE表达式,每一个表达式处理一个不同的列,避免了由于CASE只返回一种特定数据类型的能力而导致的问题。

【Listing 6:用列名字作为参数,Romley提出的方法】

ALTER PROC GetSortedShippers

@ColName AS sysname

AS

SELECT *

FROM Shippers

ORDER BY

CASE @ColName WHEN 'ShipperID'

THEN ShipperID ELSE NULL END,

CASE @ColName WHEN 'CompanyName'

THEN CompanyName ELSE NULL END,

CASE @ColName WHEN 'Phone'

THEN Phone ELSE NULL END

  按照这种方法编写代码,SQL Server能够为每一个CASE表达式返回恰当的数据类型,而且无需进行数据类型转换。但应该注意的是,只有当指定的列不需要进行计算时,索引才能够优化排序操作。

时间: 2024-10-26 10:44:08

数据库查询结果的动态排序(6)的相关文章

数据库查询结果的动态排序(2)

动态|排序|数据|数据库 二.用列名字作为参数 另外一个选择是让查询以参数的形式接收一个列名字.Listing 2显示了修改后的GetSortedShippers存储过程.CASE表达式根据接收到的参数,确定SQL Server在ORDER BY子句中使用哪一个列值.注意,ORDER BY子句中的表达式并未在SELECT清单中出现.在ANSI SQL-92标准中,ORDER BY子句中不允许出现没有在SELECT清单中指定的表达式,但ANSI SQL-99标准允许.SQL Server一直允许这

数据库查询结果的动态排序(1)

动态|排序|数据|数据库 在公共新闻组中,一个经常出现的问题是"怎样才能根据传递给存储过程的参数返回一个排序的输出?".在一些高水平专家的帮助之下,我整理出了这个问题的几种解决方案. 一.用IF...ELSE执行预先编写好的查询 对于大多数人来说,首先想到的做法也许是:通过IF...ELSE语句,执行几个预先编写好的查询中的一个.例如,假设要从Northwind数据库查询得到一个货主(Shipper)的排序列表,发出调用的代码以存储过程参数的形式指定一个列,存储过程根据这个列排序输出结

数据库查询结果的动态排序(4)

动态|排序|数据|数据库 假设我们把更多的货主加入到表,如Listing 4所示(ShipperID列有IDENTITY属性,SQL Server自动为该列生成值). [Listing 4:向Shippers表插入一些记录] INSERT INTO Shippers VALUES('Shipper4', '(111) 222-9999') INSERT INTO Shippers VALUES('Shipper5', '(111) 222-8888') INSERT INTO Shippers

数据库查询结果的动态排序(3)

动态|排序|数据|数据库 为了避免出现这种转换错误,我们可以尝试把ShipperID转换成varchar数据类型.采用这种方法之后,nvarchar将作为最高优先级的数据类型被返回.Listing 3显示了修改后的GetSortedShippers存储过程. [Listing 3:用列名字作为参数,第二次尝试] ALTER PROC GetSortedShippers @ColName AS sysname AS SELECT * FROM Shippers ORDER BY CASE @Col

数据库查询结果的动态排序(5)

动态|排序|数据|数据库 为了解决这个问题,我们可以用前置的0补足ShipperID值,使得ShipperID值都有同样的长度.按照这种方法,基于字符的排序具有和整数排序同样的输出结果.修改后的存储过程如Listing 5所示.十个0被置于ShipperID的绝对值之前,而在结果中,代码只是使用最右边的10个字符.SIGN函数确定在正数的前面加上加号(+)前缀,还是在负数的前面加上负号(-)前缀.按照这种方法,输出结果总是有11个字符,包含一个"+"或"-"字符.前

用hibernate来进行数据库查询时,需要按汉字拼音排序,急求

问题描述 用hibernate来进行数据库查询时,需要按汉字拼音排序,急求 这是查询语句 public List<MapCoordinates> getCoor() { Query query=getSession().createQuery("select new MapCoordinates(mapId, title,fwnr,fwsj, address, coordinate, tel) from MapCoordinates m order by convert_gbk(m.

Linq orderby动态排序的时候报错

问题描述 网上拷了段代码privatestaticobjectGetPropertyValue(objectobj,stringproperty){System.Reflection.PropertyInfopropertyInfo=obj.GetType().GetProperty(property);returnpropertyInfo.GetValue(obj,null);}但是我用却报错了,有大神指点一下吗?报错是:LINQtoEntities不识别方法"System.ObjectGet

求JSP页面表格动态排序,动态显示数据的思路

问题描述 有个需求,在JSP页面上表格形式显示数据,并且可以动态排序,比如说点表头的时候是倒序,再次点击是正序.做个表格策略,并且可以让用户自定义数据列,动态显示数据(比如用户只想看到这个表的哪几行列,他可以选择,将多余的列删除).如果这两个结合又该怎么做呢?在用户自定义的数据下排序? 解决方案 解决方案二:这里的增加列,排序都好做,隐藏列的话不太好做.排序的话可以到网上查一下html表格排序,有相应的代码.相应的列显示与隐藏,是个问题,数据不知道保存在哪里好,保存在JS是可以,如果数据很长的话

优化MySQL数据库查询

优化MySQL数据库查询 最简单且最安全的格式,它是磁盘格式中最快的.速度来自于数据能在磁盘上被找到的难易程度.当锁定有一个索引和静态格式的东西是,它很简单,只是行长度乘以数量.而且在扫描一张表时,每次用磁盘读取来读入常数个记录是很容易的.安全性来源于如果当写入一个静态myisam文件时导致计算机down掉,myisamchk很容易指出每行在哪里开始和结束,因此,它通常能收回所有记录,除了部分被写入的记录.在mysql中所有索引总能被重建 1.2动态myisam 这种格式每一行必须有一个头说明它