首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按varchar列排序

按varchar列排序
EN

Stack Overflow用户
提问于 2018-07-10 08:26:40
回答 2查看 63关注 0票数 2

我的数据库中有一个colum,其中包含格式的数字。

1- 1 - 2 - 2 -1 -2-2等

我想通过“第一个号码”,"second_number“来订购

我试过这样做:

代码语言:javascript
运行
复制
ORDER BY CAST('session_number' as signed) ASC

但这并不能正确地排序第二个数字。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-10 08:40:07

通过取子串并转换为签名的第一部分命令:

代码语言:javascript
运行
复制
CAST(SUBSTRING_INDEX(session_number, '-', 1) AS SIGNED) ASC, 
CAST(SUBSTRING_INDEX(session_number, '-', -1) AS SIGNED) ASC

或创建已排序项的视图:

代码语言:javascript
运行
复制
CREATE VIEW v_sessions_ordered_by_session_number 
AS 
  SELECT * 
  FROM sessions 
  ORDER BY 
    CAST(SUBSTRING_INDEX(session_number, '-', 1) AS SIGNED) ASC, 
    CAST(SUBSTRING_INDEX(session_number, '-', -1) AS SIGNED) ASC;

然后将视图用作表:

代码语言:javascript
运行
复制
SELECT some_field, session_number FROM v_sessions_ordered_by_session_number;

但是更好的解决方案是:

使session_number成为十进制,如:1.11.22.1

如果不允许修改字段类型,那么

创建额外的:session_number_order字段并保持抽取数据

票数 3
EN

Stack Overflow用户

发布于 2018-07-10 08:46:45

试试这个:

代码语言:javascript
运行
复制
select nums
from (
    select nums, position('-' in nums) `pos` from tbl
) a
order by cast(substring(nums, 1, pos - 1) as signed),
         cast(substring(nums, pos + 1, length(nums) - pos) as signed)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51260490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档