1

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

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

4

1 回答 1

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

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

于 2013-02-15T20:01:54.610 回答