2013-02-15 55 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