[问题]请教一条数据库语句

软件和网站开发以及相关技术探讨
回复
头像
liujingjing5
帖子: 512
注册时间: 2006-10-12 1:21
送出感谢: 0
接收感谢: 0

[问题]请教一条数据库语句

#1

帖子 liujingjing5 » 2007-12-12 11:30

要求按照下面这种方式排,先排名称,再按照型号中的第一个数排,再按照型号中的第二个数排
名称 型号
玩具娃娃 50*300cm
玩具娃娃 100*60cm
玩具娃娃 100*800cm
玩具小狗 50*100mm
玩具小狗 200*100mm
玩具小狗 230*50mm
玩具熊 60cm
玩具熊 100cm

因为是字符串所以100会排到60的前面(要小的在前)

拜托大家了,急求
mongoose
帖子: 22
注册时间: 2006-09-29 17:44
送出感谢: 0
接收感谢: 0

#2

帖子 mongoose » 2007-12-12 16:22

型号字段应该设计为两个字段,要不有的230*50mm,有的60cm,不是给自己填堵么
头像
hubert_star
论坛版主
帖子: 5372
注册时间: 2007-10-29 22:12
系统: OSX 10.9 + Ub 1304
来自: 江苏南京
送出感谢: 0
接收感谢: 5 次

#3

帖子 hubert_star » 2007-12-12 16:56

呵呵,楼上有点激动了。

确实字段设计有问题,如果一定要这样设计的话,可以按照如下方式查询,这是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混在一起结果还是有问题的。

如果是其他数据库,思路不变但是函数要改一下,查文档吧。

另外,由于排序的原因结果集里面包含了拆分后的字段值,可以在应用里面不显示这两个字段或者再加一级查询或视图去掉这两个字段就行了。

直接写的,如果要用的话你还要继续细化一下。
头像
windwiny
帖子: 2254
注册时间: 2007-03-13 17:26
送出感谢: 0
接收感谢: 1 次

#4

帖子 windwiny » 2007-12-12 20:01

楼上果然强
回复

回到 “软件/网站开发”