postgresql中字符串与数字的混合排序

数据中心部分数据的标题是混合字符串与数组的,比如:

… site no. 1
… site no. 10
… site no. 2

之前,是按照title的字符进行升序排序了,排序结果就如上所示。这里和我们常规理解有所区别的就在于其排序是按照1、10、11、…、2、3进行排序的,而我们通常想要的结果是希望按照站点编号的自然数大小进行排序,即1、2、…、9、10…。

之前的sql语句是这样的:

… order by title

而要满足这个要求,第一个改造的结果是这样的:

… order by substring(title, ‘[^0-9]*’), (substring(title, ‘No.([0-9]+)’))::int

这样可以满足上面的需求,即No.1之类的标题可以排序,但若数字在中间就难以处理了,比如:

…10 July, 2012
…9 August, 2012

因此又继续改造:

…order by regexp_replace(title,'[0-9]+’,”,’g’),(substring(title, ‘([0-9]+)’))::int

这样可以解决上面的问题,但还是不完美,即有多个间断的数字,排序还是有问题的。
比如:

…10 July, 2012
…9 July, 2013

这种问题留待以后解决吧。


已发布

分类

来自

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注