自定义 ORDER BY 的问题

2017-08-11 10:59:05 +08:00
 860670496
新手,最近爬了个历史年表,公元纪年的字段是 varchar (例如公元前 32 年:“前 32 ”,公元 6 年:“ 6 ”,公元 1984:“ 1984 ”)。
ORDER BY FIELD 貌似要把整个列表都写出来,显然不能行
想问一下这种情况要怎么写才能按公元纪年的顺序排列呢?
3437 次点击
所在节点    MySQL
8 条回复
ayumilove
2017-08-11 11:25:20 +08:00
把公元前 替换成 负数
Alexisused
2017-08-11 11:34:24 +08:00
1 楼说的对
860670496
2017-08-11 11:43:38 +08:00
@ayumilove #1 这个办法也想过,然后用+0 之类的办法就可以
我更想知道的是 MySQL 支不支持 ORDER BY 一定的通用规则,直接能做到这种排列呢?
xshwy
2017-08-11 11:48:35 +08:00
SELECT * FROM `SCHEDULE`
WHERE RATE IS NOT NULL AND RATE!=''
ORDER BY SCHEDULE_DATE , FIELD(START_TIME,'8:00','18:30','21:00','21:30')
LeeSeoung
2017-08-11 11:52:12 +08:00
order by 转化(字段) 转化就是你把 varchar 的公元信息转成数字一类的。。
860670496
2017-08-11 13:58:02 +08:00
@xshwy #4 field 的写法我查过,如果没写进去的字符串,会自动当作 0 来排序……

使用函数 FIELD(str,str1,str2,str3,...)
MySQL 的自定义排序,str 与 str1、str2、str3...进行比较,并按照 str1,str2,str3...的顺序输出,如果遇到 str 为 null 或者不存在 str1,str2,str3...中的情况的则序列为 0

我总不能把公元前的所有字符串都写一遍吧?

@LeeSeoung #5 这个我以前就用过,问题是 CAST 或者 CONVERT 没办法处理“前 32 ”这种情况啊

本来还思考过加一个 ID 字段来排序,后来一想这个表以后说不定还要在中间年份插入记录,肯定不会只往后加……现在暂时就采取 1 楼的办法 update 一下吧,多谢各位
LeeSeoung
2017-08-11 14:09:34 +08:00
平时用的 oracle 有 regexp_replace 这样的函数,查了下 mysql 并没有,可以利用下面的语句实现类似的功能吧

IF(url REGEXP 'test.yahoo.com.cn',REPLACE(url,'www1.sohu.com','www.sina.com'),REPLACE(url,'www2.yahoo.com','www.sina.com'))
finull
2017-08-11 21:17:30 +08:00
ORDER BY ( CASE WHEN date LIKE '前%' THEN 0 - SUBSTRING(date, 2) ELSE date END )

可能有类型转化问题,试试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/382141

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX