【问题标题】:Sorting varchar column by number, character [duplicate]按数字,字符对varchar列进行排序[重复]
【发布时间】: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


【解决方案1】:

我认为以下方法会起作用:

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

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

【讨论】:

  • 剂量似乎有效,我为它创建了一个小提琴:sqlfiddle.com/#!12/10aeb/2
  • 另外,字符和数字没有固定的顺序,可以是CNCN, NCNCN, NNNCC (N Number, C Char)
猜你喜欢
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多