2012-10-16 220 views
2

我對樣本表的特定列符號有以下示例數據。如何對postgres中的不規則字母數字數據進行排序sql

(更新:)數據不是常規模式。號碼可能出現在字符之間的任何地方。

symbol 

COL4A1 
COL4A3 
COL8A2 
COL2A1 
COL12A1 
COL12A1 
COL16A1 
COL19A1 

我需要在數據庫級別對這些數據進行排序。我用下面的查詢:

select symbol from sample order by symbol asc 

結果如下:

COL12A1 
COL12A1 
COL16A1 
COL19A1 
COL2A1 
COL4A1 
COL4A3 
COL8A2 

但我需要通過以下方式順序:

COL2A1 
COL4A1 
COL4A3 
COL8A2 
COL12A1 
COL12A1 
COL16A1 
COL19A1 
+0

我看到你的編輯改變了你的問題的意思。如果您徹底改變問題的參數,請考慮提出一個新問題。另外,在編輯問題時不會發送通知,所以沒有人知道您已將其更改爲另一個問題。 –

+2

我已經發布了描述新問題的後續問題,其中包含適當變量的示例數據,SQLFiddle等。請看看它是否準確描述了您的問題:http://stackoverflow.com/問題/ 12965463 /人性化或自然數字排序的混合詞和數字字符串 –

+0

@克雷格林格,我從我的隊友之一得到了解決方案。它修復了我的問題。請參閱下面的答案。 –

回答

4

PostgreSQL並不提供數可以做到「人性化」的排序類似「1A,2A,3A,... 10A,11A,...」。它依賴操作系統進行整理,並且我不知道有任何操作系統會將這種排序規則公開給應用程序。

要做到這一點,您需要根據圖案拆分文本並按圖案部分排序,可能使用regexp_matches

CREATE TABLE Table1 ("symbol" text); 
INSERT INTO Table1 ("symbol") VALUES 
    ('COL4A1'),('COL4A3'),('COL8A2'),('COL2A1'), 
    ('COL12A1'),('COL12A1'),('COL16A1'),('COL19A1'); 

WITH matched(symbol, symbol_parts) AS (
    SELECT symbol, regexp_matches(symbol, '(\D*)(\d+)(\D+)(\d+)') 
    FROM Table1 
) 
SELECT symbol 
FROM matched 
ORDER BY symbol_parts[1], symbol_parts[2]::integer, 
     symbol_parts[3], symbol_parts[4]::integer; 
+3

如果你做了很多事情,那麼預先計算和存儲這些部分(或者將它們轉換成可排序的內容,例如INSERT/UPDATE上的'COL002A001')可能是一個好主意。 –

+0

@SivaramChintalapudi只是FYI我已經修正了正則表達式來處理首先有數字的代碼,並且更準確地匹配非數字。 –

2
CREATE OR REPLACE FUNCTION pad_numbers(text) 
       RETURNS text AS 
      $BODY$ 
       SELECT regexp_replace(
       regexp_replace(
        regexp_replace(
        regexp_replace(
         $1, 
         E'(^|\\D)(\\d{1,3}($|\\D))', E'\\1000\\2', 'g' 
        ), E'(^|\\D)(\\d{4,6}($|\\D))', E'\\1000\\2', 'g' 
       ), E'(^|\\D)(\\d{7}($|\\D))', E'\\100\\2', 'g' 
       ), E'(^|\\D)(\\d{8}($|\\D))', E'\\10\\2', 'g' 
      ); 
      $BODY$ 
       LANGUAGE 'sql' VOLATILE; 


select symbol from sample order by pad_numbers(symbol) asc 
+0

它可以處理字符之間的數字高達9位 –

+1

我可能會喜歡這裏給出的方法之一(http://stackoverflow.com/questions/12965463/humanized-or-natural-number-sorting-of-混合詞和數字字符串),但最終當然取決於你。 –

+0

@克雷格林格:是的。你說得對。我認爲他們是非常有效的方法。 –

相關問題