代码之家  ›  专栏  ›  技术社区  ›  Young

如何按列的一部分排序?

  •  0
  • Young  · 技术社区  · 15 年前

    我想做一个 order by 使用某列的一部分填充。例如,该列的一些记录 user 如下所示

    vip1,vip2,vip21,vip10,vip100
    

    order by user ,顺序是

    vip1,vip10,vip100,vip2,vip21
    

    那么我怎样才能得出如下结果呢

    vip1,vip2,vip10,vip21,vip100
    

    谢谢。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Martin Smith    15 年前

    什么RDBMS?

    对于SQLServer来说,要获得数字排序而不是字典排序

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

    对于MySQL

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

    但你为什么要储存 vip 如果所有行都是相同的,那就完全分开?

        2
  •  1
  •   MJB    15 年前

    您还可以将用户名('vip')替换为nothing(''),然后添加零,然后进行排序。不是更有效,只是更通用。

        3
  •  1
  •   Jay    15 年前

    “前缀”部分总是正好3个字符吗?如果没有,事情就复杂了。嗯,有了博士后你可以

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

    我想那会有用的,我还没试过。不管怎么说,关键是,如果你有一个函数可以做正则表达式,你可以去掉一个前导的字母串,然后去掉剩下的,把它转换成int。

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