要求按照下面这种方式排,先排名称,再按照型号中的第一个数排,再按照型号中的第二个数排
名称 型号
玩具娃娃 50*300cm
玩具娃娃 100*60cm
玩具娃娃 100*800cm
玩具小狗 50*100mm
玩具小狗 200*100mm
玩具小狗 230*50mm
玩具熊 60cm
玩具熊 100cm
因为是字符串所以100会排到60的前面(要小的在前)
拜托大家了,急求
[问题]请教一条数据库语句
- liujingjing5
- 帖子: 512
- 注册时间: 2006-10-12 1:21
- hubert_star
- 论坛版主
- 帖子: 5373
- 注册时间: 2007-10-29 22:12
- 系统: OSX 10.9 + Ub 1304
- 来自: 江苏南京
呵呵,楼上有点激动了。
确实字段设计有问题,如果一定要这样设计的话,可以按照如下方式查询,这是postgresql的语法。
其中test_forum就是你的表,name和value分别代表名称和型号。
基本的思路是先拆分字符串,第一个位转化为数字,第二个位经过一个空与非空的判断后再转化为数字。
下面是几个函数在这里的用途:
split_part:的拆分字符串
trim:清理非数字的字符
to_number:转换数字
这里限定了一个条件就是你的一个名称里面的型号保证单位是唯一的,不然cm和mm混在一起结果还是有问题的。
如果是其他数据库,思路不变但是函数要改一下,查文档吧。
另外,由于排序的原因结果集里面包含了拆分后的字段值,可以在应用里面不显示这两个字段或者再加一级查询或视图去掉这两个字段就行了。
直接写的,如果要用的话你还要继续细化一下。
确实字段设计有问题,如果一定要这样设计的话,可以按照如下方式查询,这是postgresql的语法。
代码: 全选
SELECT name, value,
to_number(split_part(value, '*', 1), '999999') AS before_n,
CASE WHEN ((trim(both 'cm' from split_part(value, '*', 2)) IS NOT NULL) AND (trim(both '' from split_part(value, '*', 2)) <> ''))
THEN to_number(trim(both 'cm' from split_part(value, '*', 2)), '9999999')
ELSE NULL
END AS after_n
FROM test_forum
order by name,before_n,after_n
;
其中test_forum就是你的表,name和value分别代表名称和型号。
基本的思路是先拆分字符串,第一个位转化为数字,第二个位经过一个空与非空的判断后再转化为数字。
下面是几个函数在这里的用途:
split_part:的拆分字符串
trim:清理非数字的字符
to_number:转换数字
这里限定了一个条件就是你的一个名称里面的型号保证单位是唯一的,不然cm和mm混在一起结果还是有问题的。
如果是其他数据库,思路不变但是函数要改一下,查文档吧。
另外,由于排序的原因结果集里面包含了拆分后的字段值,可以在应用里面不显示这两个字段或者再加一级查询或视图去掉这两个字段就行了。
直接写的,如果要用的话你还要继续细化一下。