按编号,字符对varchar列进行排序

时间:2013-02-15 18:58:31

标签: sql postgresql natural-sort

我有一个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,我将列分成两部分,并尝试在开头提取列字符,在结尾处提取数字。

是否有更好的等待,并确保返回预期的输出

1 个答案:

答案 0 :(得分:0)

我认为以下内容可行:

order by (case when flat_number ~ '^[0-9]+$' then 0 else 1 end),
         (case when flat_number ~ '^[0-9]+$' then length(flat_number) end),
         flat_number

首先对数字进行排序,使用技巧将它们按数字顺序排列,然后对其余数字进行排序。