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

时间:2015-09-06 11:46:51

标签: sql database postgresql

我拥有的是列中的数字和范围的混合

Range
---------
1
3-4
4
5-10
8-9
12-20
2
7
9
11-14
6
10

我想要的是是按以下方式订购的

Range
---------
1
2
3-4
4
5-10
6
7
8-9
9
10
11-14
12-20

无效 - 简单的ORDER BY "Range"会产生以下内容(如预期的那样)

Range
---------
1
10
11-14
12-20
2
3-4
4
5-10
6
7
8-9
9

我是否有“简单”的方式让它按照我的要求对值(范围和数字)进行排序?

2 个答案:

答案 0 :(得分:0)

您可以使用此类查询:

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之后出现等等)

上述查询假定您始终拥有指定格式的数据 - 仅限数字或数字编号。对于其他情况,它会失败。

答案 1 :(得分:0)

根据您的实际问题,使用split_part()

最容易做到这一点
order by cast(split_part(range, '-', 1) as int)

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