我拥有的是列中的数字和范围的混合
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
我是否有“简单”的方式让它按照我的要求对值(范围和数字)进行排序?
答案 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)
当然,这假定字符串中的值是数字。如果不是,那么请问另一个问题,例如值以及如何对它们进行排序。