我拥有的是这样一个列中的数字和范围的混合
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
是否有一种“简单”的方法让它按我想要的顺序排列值(范围和数字)?
发布于 2015-09-06 12:00:55
您可以使用这样的查询:
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之后,等等)。
上面的查询假设您始终拥有指定格式的数据,无论是数字还是数字。在其他情况下,它将失败。
发布于 2015-09-06 13:15:38
考虑到您的实际问题,使用split_part()
最容易做到这一点
order by cast(split_part(range, '-', 1) as int)
当然,这假定字符串中的值是数字的。如果它们不是,那么问另一个问题,例如值以及它们应该如何排序。
https://stackoverflow.com/questions/32423200
复制相似问题