如何按列的一部分订购?

时间:2010-07-20 01:54:18

标签: sql mysql

我想使用某些列的一部分制作order by内容。例如,列user的某些记录如下所示

vip1,vip2,vip21,vip10,vip100

如果我执行order by user,订单将是

vip1,vip10,vip100,vip2,vip21

那我怎样才能得到如下结果

vip1,vip2,vip10,vip21,vip100

感谢。

3 个答案:

答案 0 :(得分:1)

什么是RDBMS?

对于SQL Server来获取数字排序而不是字典排序,它将类似于

ORDER BY CAST(RIGHT(col, LEN(col)-3) AS INT)

对于MySQL

ORDER BY CAST(RIGHT(col, LENGTH(col)-3) AS UNSIGNED)

但是,如果所有行都相同,为什么要存储vip部分呢?

答案 1 :(得分:1)

您也可以用任何内容('')替换用户名('vip')并添加零,然后排序。没有更高效,更通用。

答案 2 :(得分:1)

“前缀”部分总是正好是3个字符吗?如果没有,这变得复杂。嗯,你可以用Postgres

order by regexp_matches(userid,"^[a-z]*")[1], substring(userid, regexp_matches(userid,"^[a-z]*")[1])::int

我认为这样可行,我没试过。无论如何,关键是,如果你有一些能做正则表达式的函数,你可以找到一个领先的alpha字符串,然后将剩下的东西剥掉并将其转换为int。

如果你真的在alpha字段中嵌入了一个数字,那么更好的选择是:不要这样做。如果这是两个不同的逻辑数据项,则将其设为两个字段。把田地放在一起比把它们分开要容易得多。