2010-11-02 62 views
5

我需要使用數字和文本順序使用varchar列排序選擇查詢。查詢將在java程序中完成,使用jdbc over postgresql。如何對PostgreSQL中包含單詞和數字的VARCHAR列進行排序?

如果我在SELECT子句中使用ORDER BY我獲得:

1 
11 
2 
abc 

不過,我需要獲得:

1 
2 
11 
abc 

的問題是,該列還可以包含文本。

這個問題是類似(但針對SQL服務器):

How do I sort a VARCHAR column in SQL server that contains words and numbers?

然而,提出的解決方案並沒有在PostgreSQL工作。

在此先感謝,問候,

回答

6

我有同樣的問題和下面的代碼解決它:

SELECT ... 
    FROM table 
    order by 
    CASE WHEN column < 'A' 
     THEN lpad(column, size, '0') 
    ELSE column 
     END; 

大小var爲varchar列的長度,e.g 255用於改變(255)。

+0

該解決方案奏效,謝謝。 – 2010-11-03 10:58:43

+1

請注意,這會在列的大小和順序之間產生依賴關係,如果要更改列的大小,這將不會引起頭部劃傷。 – 2012-12-29 00:08:49

4

您可以使用正則表達式做這樣的事情:

select THECOL from ... 
order by 
    case 
    when substring(THECOL from '^\d+$') is null then 9999 
    else cast(THECOL as integer) 
    end, 
    THECOL 

首先使用正則表達式以檢測列的內容是否是數字。在這種情況下,我使用'^ \ d + $',但您可以修改它以適應情況。

如果正則表達式不匹配,則返回一個大數字,以使該行落到該訂單的底部。

如果正則表達式匹配,則將該字符串轉換爲數字,然後對其進行排序。

在此之後,定期與列進行排序。

+0

這是一個乾淨的解決方案。 – 2012-12-29 00:09:05

+0

就在您停止尋找最佳解決方案並決定解決方法時,您會發現正確的解決方案。 我的帽子是給你的先生,謝謝! – emptywalls 2015-08-30 20:47:02

相關問題