当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [问题]请教一条数据库语句
帖子发表于 : 2007-12-12 11:30 
头像

注册: 2006-10-12 1:21
帖子: 512
送出感谢: 0 次
接收感谢: 0 次
要求按照下面这种方式排,先排名称,再按照型号中的第一个数排,再按照型号中的第二个数排
名称 型号
玩具娃娃 50*300cm
玩具娃娃 100*60cm
玩具娃娃 100*800cm
玩具小狗 50*100mm
玩具小狗 200*100mm
玩具小狗 230*50mm
玩具熊 60cm
玩具熊 100cm

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

拜托大家了,急求


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-12-12 16:22 

注册: 2006-09-29 17:44
帖子: 22
送出感谢: 0 次
接收感谢: 0 次
型号字段应该设计为两个字段,要不有的230*50mm,有的60cm,不是给自己填堵么


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-12-12 16:56 
头像

注册: 2007-10-29 22:12
帖子: 5353
地址: 江苏南京
系统: OSX 10.9 + Ub 1304
送出感谢: 0 次
接收感谢: 5
呵呵,楼上有点激动了。

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

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

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

直接写的,如果要用的话你还要继续细化一下。


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-12-12 20:01 
头像

注册: 2007-03-13 17:26
帖子: 2254
送出感谢: 0 次
接收感谢: 1
楼上果然强


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:Sogou [Spider] 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译