sql - PostgreSql - 订购数字字符串和数字范围的混合

标签 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

有没有一种“简单”的方法可以让我按照我的意愿对值(范围和数字)进行排序?

最佳答案

您可以使用这样的查询:

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

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

关于sql - PostgreSql - 订购数字字符串和数字范围的混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32423200/

相关文章:

mysql - 数据库查询中的锁

Django CONN_MAX_AGE 设置为 0 但连接在执行查询后保持打开状态

php - Mysql REGEX 匹配查询

mysql - SQL 将 TIMEStamp 更新为 Now()

mysql - IN 条件下的数据库字段

database - ORA-04068,规范中只有常量 (DB 11.2.0.4)

PostgreSQL 如何在递归查询中计算记录数

performance - 了解 Postgres 9.5 中的 json_agg 性能

MySQL - 从一列中创建一条记录

mysql - SQL - 提高性能