我所拥有的是像这样的列中数字和范围的混合
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/