SQL Server 2000实现一则按类似VB VAL函数功能排序的案例
最近,在项目维护时,碰到对以下的数据进行排序处理:
排序前:
班级 | 照片名称 |
机械1班 | 1张三.jpg |
机械1班 | 7李四.jpg |
机械1班 | 3王五.jpg |
财会2班 | 3如花.jpg |
财会2班 | 6像花.jpg |
财会2班 | 1真花.jpg |
体育1班 | 3铁男.jpg |
体育1班 | 1猛男.jpg |
财会2班 | 10若花.jpg |
体育1班 | 30衰男.jpg |
排序后(要实现的结果):
班级 | 照片名称 |
财会2班 | 1真花.jpg |
财会2班 | 3如花.jpg |
财会2班 | 6像花.jpg |
财会2班 | 10若花.jpg |
机械1班 | 1张三.jpg |
机械1班 | 3王五.jpg |
机械1班 | 7李四.jpg |
体育1班 | 1猛男.jpg |
体育1班 | 3铁男.jpg |
体育1班 | 30衰男.jpg |
也许有人会说,这还不简单,只要输入"SELECT 班级, 照片名称 FROM [Table] ORDER BY 班级, 照片名称"语句,不就出结果了吗?事实如此吗,请看此SQL语句执行后的结果:
班级 | 照片名称 |
财会2班 | 10若花.jpg |
财会2班 | 1真花.jpg |
财会2班 | 3如花.jpg |
财会2班 | 6像花.jpg |
机械1班 | 1张三.jpg |
机械1班 | 3王五.jpg |
机械1班 | 7李四.jpg |
体育1班 | 1猛男.jpg |
体育1班 | 30衰男.jpg |
体育1班 | 3铁男.jpg |
是不是与预期的结果有很大的出入呢? 怎样解决这问题,实现想要的结果呢?由于SQL Server没有类似VB的VAL函数,因此想实现如上数据的排序,将比较困难。不过,只要执行以下SQL语句就可以了,今天免费赠送了。废话少说,亮代码:
SELECT 班级, 照片名称
FROM (SELECT *, CASE WHEN (UNICODE(SUBSTRING(photo, 1, 1)) BETWEEN 48 AND
57) AND NOT (UNICODE(SUBSTRING(photo, 2, 1)) BETWEEN 48 AND 57)
THEN SUBSTRING(photo, 1, 1) WHEN (UNICODE(SUBSTRING(photo, 1, 1))
BETWEEN 48 AND 57) AND (UNICODE(SUBSTRING(photo, 2, 1)) BETWEEN
48 AND 57) THEN SUBSTRING(photo, 1, 2) END AS photoid
FROM (SELECT *, LTRIM(照片名称) AS photo
FROM [TABLE]) l) ll
ORDER BY 班级, CAST(ISNULL(photoid, 0) AS int)
没想到一个简单的功能,要写这么复杂的代码。看来,前人"造轮子"没造全,将会给后面的应用开发人员带来不小的烦恼。