2013-02-15 68 views
0

我有具有一定值排序varchar列,字符

A1A1A 
A1A2A 
A1A101A 
A3A5A 
12 
A2 
A3 

一个varchar column [flat_number]我希望得到按数量排序结果,然后由第一

12 
A2 
A3 
A1A1A 
A1A2A 
A1A101A 
A3A5A 
字符

我设法用数字进行排序(如果列只包含使用正则表达式0-9数字,我把它当作一个数字),然后我用字符排序,但它dosent似乎对科拉姆工作n个值作为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和其他排序它 我拆分柱分成2份,并尝试以提取在开始时的列字符和结束时的数量。

是否有更好的等待这样做,并且确保所期望的输出返回

+0

在第一个SELECT语句COALESCE为什么不将数字转换成字符,然后对它们进行排序呀? – AlexLordThorsen 2013-02-15 19:13:04

+0

转换的数字字符将它们排序为,1,10,2 – Akash 2013-02-16 03:31:07

回答

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 

这第一笔订单的数量,采用放一招他们按数字顺序,然后命令其余的数字。

+0

dosent似乎工作,我已经创造了它一个小提琴:http://sqlfiddle.com/#!12/10aeb/2 – Akash 2013-02-16 03:37:22

+0

另外,有没有字符和数字的固定的顺序,也可以是CNCN,NCNCN,NNNCC(N数,C CHAR) – Akash 2013-02-16 03:42:15