首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PostgreSql -对数字字符串和数字范围的混合排序

PostgreSql -对数字字符串和数字范围的混合排序
EN

Stack Overflow用户
提问于 2015-09-06 11:46:50
回答 2查看 621关注 0票数 1

我拥有的是这样一个列中的数字和范围的混合

代码语言:javascript
运行
复制
Range
---------
1
3-4
4
5-10
8-9
12-20
2
7
9
11-14
6
10

我想要的是以以下方式对它们进行排序

代码语言:javascript
运行
复制
Range
---------
1
2
3-4
4
5-10
6
7
8-9
9
10
11-14
12-20

不能工作--简单的ORDER BY "Range"会产生以下结果(如预期的)

代码语言:javascript
运行
复制
Range
---------
1
10
11-14
12-20
2
3-4
4
5-10
6
7
8-9
9

是否有一种“简单”的方法让它按我想要的顺序排列值(范围和数字)?

EN

回答 2

Stack Overflow用户

发布于 2015-09-06 12:00:55

您可以使用这样的查询:

代码语言:javascript
运行
复制
SELECT *
FROM YourTableName
ORDER BY 
    CAST(
        CASE WHEN position('-' in Range) > 0 
        THEN substr(range, 0, position('-' in Range)) 
        ELSE Range 
        END 
    as integer)

ORDER BY语句中,首先从范围中提取一个数字:

  • 如果满足条件position('-' in Range) > 0,这意味着字符串中有一个'-',所以应该取一个数字直到'-‘,这是使用substr(range, 0, position('-' in Range))实现的。例如,如果列中有10-14,则此步骤只采用10
  • 如果前面的条件没有得到满足,那么您可以使用Range

在上面的检查完成后,你的电话号码。在本例中,您将此值转换为整数,因此它正确地对数字进行了排序(例如,10在2之后,等等)。

上面的查询假设您始终拥有指定格式的数据,无论是数字还是数字。在其他情况下,它将失败。

票数 1
EN

Stack Overflow用户

发布于 2015-09-06 13:15:38

考虑到您的实际问题,使用split_part()最容易做到这一点

代码语言:javascript
运行
复制
order by cast(split_part(range, '-', 1) as int)

当然,这假定字符串中的值是数字的。如果它们不是,那么问另一个问题,例如值以及它们应该如何排序。

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

https://stackoverflow.com/questions/32423200

复制
相关文章

相似问题

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