【发布时间】:2013-02-15 18:58:31
【问题描述】:
我有一个varchar column [flat_number],它有一些值
A1A1A
A1A2A
A1A101A
A3A5A
12
A2
A3
我希望得到的结果先按数字排序,然后按字符排序
喜欢
12
A2
A3
A1A1A
A1A2A
A1A101A
A3A5A
我已经设法按数字对其进行排序(如果该列仅包含使用正则表达式的数字 0-9,我将其视为一个数字),然后我按字符对其进行排序,但它似乎不适用于 A1A101A 的列值(有多种数字和字符的组合)
CASE
WHEN length(flat_number) < 10 AND flat_number SIMILAR TO '[0-9]+'
THEN
flat_number::int
END
ELSE
NULL
END,
( SELECT COALESCE( match[1], NULL ) FROM regexp_matches( flat_number, '[^0-9]+' ) AS match ),
( SELECT COALESCE( left( match[1], 9), NULL ) FROM regexp_matches( flat_number, '([0-9]+$)' ) AS match )::int
当前查询作为
如果该列仅包含数字 [0-9],我将其转换为 int 并对其进行排序 ElSE,我将列分成两部分,并尝试提取开头的列字符和结尾的数字。
是否有更好的等待方式并确保返回预期的输出
【问题讨论】:
-
在第一个 SELECT COALESCE 语句中,为什么不将数字转换为字符,然后按这种方式排序?
-
将数字转换为字符会将它们排序为 1、10、2
标签: sql postgresql natural-sort