老杂毛博客
  青青子衿,悠悠我心。但为君故,沉吟至今。
博客首页 | 人生历程 | 编程开发 | 机关门  
  文章分类
 
博客首页 > 软件网络编程 > 文章正文

sql自定义排序规则

2011/8/31 18:06:57
 

通常在一个数据表里我们都会按时间排序或按id号排序,但是有的时候为了更好的控制数据我们会再增加一列排序字段,然后按排序字段里的数值排序。

排序字段应该注意的问题:

首先,应该倒序排序,也就是说排序号最大的排在最上面,而不是排序号最小的排在最上面,因为一但我们排序号达到了0,如果再往前面增加的话就只能是负数了,所以如果是倒序排序则不会出现这种问题。

其次,排序号最好中间有过度数字,如100,95,90,85,80这样排序,因为一但需要在某两条记录之间增加一条新数据这样就无需修改其它的排序号直接取两条记录排序号的中间值就可以了。

下面我要说的是排序中另一种比较复杂的情况,因为同一个产品表可能属于不同的分类,而在不同的分类中我们需要用不同的排序规则,比如id为10的商品在分类一中可能排最前面,但是在分类二中可能排最后面,这样用一个排序字段列就无法完成我们需要的功能了。网上有朋友说这种情况可以再增加一个排序列,那么如果是无限个分类呢,是不是需要增加无限排序列。

为此我想到了另一种排序方法,在分类表中让每一个分类对应一套排序规则:如

最新上市,(14,15,18,8,9,7)
最新推荐,(38,234,23,123,3242,34)
精品推荐,(345,234,234656,232,21343,45)

在我们取数据的时候就需要按着这个规则来排序,那么如何来完成这个功能呢。

查询方法我们谁都会,比如:

select * from product where pid in (14,15,18,8,9,7)

这样得到的结果是:

这样的结果显示是不对的,因为我们需要得到的排序结果是14,15,18,8,9,7这样的排序结果,那么如何来实现这种排序呢,其实我们只需要利用charindex这个函数就可以完成这样的功能了。SQL语句如下:

select * from product where pid in (14,15,18,8,9,7) order by charindex(','+ltrim(pid)+',',',14,15,18,8,9,7,')

查询结果如下:

Ok,这才是我们想要的数据,但是,到这里还没有完。

万一我们制定的排序规则没有完,只限定于前几条,后面id号没有出现在这个列表中的数据要排在最后,那么,如何来实现这个功能呢。

想来想去,我决定用判断来试一下,SQL语句如下:

select * from product where pid in (14,15,18,8,9,7) or itemid=2  order by CASE when(charindex(','+ltrim(pid)+',',',14,15,18,8,9,7,'))=0 then len(',14,15,18,8,9,7,')+1 else charindex(','+ltrim(pid)+',',',14,15,18,8,9,7,') end

OK,至此功能完成

代码讲解

首先我们需要知道charindex这个函数的功能,本函数是完成在某一字段串中查出字符的位置,我们在查询之时前后都加了一个逗号目的是让它变的唯一,如果不加逗号的话有可能14和41或141出现重复,当查询出位置之后再排序就完成了按规则排序,那么第二步中如果有其它的数据,我们默认查不到所在位置这时候charindex就会返回0,我判断如果等于0就返回当前字段串长度加1(这样永远也不会大于当前已包含数值位置的值,所以排序只能排在已有数值之后)。

OK,通过这样的规则设定,我们的自定义排序功能就大功告成了,相信这个方法可以应用于多个领域。(老杂毛/文)

2011年10月28日更新

通过近几天的研究发现,如果这个按以上的规则调用数据的话如果同时存在分页的情况就会出现这样的情况

在没有出现在排序规则中的产品在分页的时候有可能重复出现,为此我重新修改了一下这个语句,因为在产品表里有排序字段一列,这样这个字段永远不会重复,或直接用产品的pid也可以。

代码改为:

order by CASE when(charindex(','+ltrim(pid)+',',',14,15,18,8,9,7,'))=0 then pid+100 else charindex(','+ltrim(pid)+',',',14,15,18,8,9,7,') end

pid加100是因为制定排序规则的产品不会超过一百个,如果不加一百的话可能影响前面的排序。

OK,至此这个自定义规则算是完美了。

阅读: (1574)  评论(4)  
 
网友评论:
 
 1.qin5sa.com2011/9/3 0:24:00 
写的很详细,学习了
 2.Xaria2011/9/20 12:59:04 
Furrleaz? That's marvelously good to know.
 3.222.128.179.332016/3/9 16:25:11 
这个函数从没用过,原来是做这个功能的,佩服
 4.2016/7/11 23:45:00 
 
相关文章:
 微信支付asp.net V3.3.7 sys
 ERRORLOG 文件太大的处理办法
 Attempted to read or w
 Ctrl键自动按下,Ctrl键和Alt总感觉
 解决 Your project contai
 adb install 多设备id号一样,如
 如何去掉优酷,土豆等网站的广告?
 webview的loadData方法加载乱码
 让iis7支持apk文件下载
 sql利用游标循环,遍历表循环结果集
 
 
     
联系作者: QQ: 657603425 Email: 657603425@qq.com
Copyright © 2007-2014 www.laozamao.com All Rights Reserved
京ICP备09002242号 北京海淀分局备案号:1101084842