order by varchar列

pxy2qtax  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(323)

我的数据库中有一个列,其中包含以下格式的数字
1-1 1-2 2-1 2-2等
我想按“第一个号码”、“第二个号码”订购
我试过这个:

  1. ORDER BY CAST('session_number' as signed) ASC

但这不是第二个数字的正确顺序。

63lcw9qa

63lcw9qa1#

试试这个:

  1. select nums
  2. from (
  3. select nums, position('-' in nums) `pos` from tbl
  4. ) a
  5. order by cast(substring(nums, 1, pos - 1) as signed),
  6. cast(substring(nums, pos + 1, length(nums) - pos) as signed)

order by 第一句,你先按第一个数字订货(在破折号之前) - ),第二个顺序是根据第二个数字(在破折号之后)。

8ulbf1ek

8ulbf1ek2#

由第一方订购,取下子串并铸造至签字处:

  1. CAST(SUBSTRING_INDEX(session_number, '-', 1) AS SIGNED) ASC,
  2. CAST(SUBSTRING_INDEX(session_number, '-', -1) AS SIGNED) ASC

或创建已排序项目的视图:

  1. CREATE VIEW v_sessions_ordered_by_session_number
  2. AS
  3. SELECT *
  4. FROM sessions
  5. ORDER BY
  6. CAST(SUBSTRING_INDEX(session_number, '-', 1) AS SIGNED) ASC,
  7. CAST(SUBSTRING_INDEX(session_number, '-', -1) AS SIGNED) ASC;

然后将视图用作表:

  1. SELECT some_field, session_number FROM v_sessions_ordered_by_session_number;

但更好的解决方案是:
制造 session_number 小数点如下: 1.1 , 1.2 , 2.1 等等
如果不允许修改字段类型
创建额外的: session_number_order 字段并保留十进制数据

展开查看全部

相关问题