2014-02-12 43 views
0

我需要SQL查詢創建的一些幫助。我有一個像部分子串的SQL順序

EN 771-2:2011 
EN 197-1:2011 
EN 295-1:2013 
771-1:2011 
EN 54-24:2008 
EN 492:2012 
EN 54-25: 2008 
EN 331:1998 
EN 534:2006+A1:2010 
EN 588-2:2001 
EN 179:2008 
EN 598:2007+A1:2009 
EN 621:2009 
EN 682: 2002 

數據可以創建ORDER BY causule,當排序的結果將是:分別

EN 54-24:2008 
EN 54-25: 2008 
EN 179:2008 
EN 197-1:2011 
EN 295-1:2013 
EN 331:1998 
EN 492:2012 
EN 534:2006+A1:2010 
EN 588-2:2001 
EN 598:2007+A1:2009 
EN 621:2009 
EN 682: 2002 
771-1:2011 
EN 771-2:2011 

,我需要的訂單,這將在字符串的一部分依賴:

EN - :2008年, EN - :2008年, - :2011年, EN - :2011

粗體字應該有最高的優先級和斜體字符應具有較低。 是否有可能創建「ORDER BY」這樣的結果呢?我知道子字符串函數,但她給我不同的結果。

謝謝你的幫助。

+1

您應該可以使用String函數(請參閱:http://www.postgresql.org/docs/9.3/static/functions-string.html)來實現您正在嘗試的操作。注意:您可以使用CAST將子字符串轉換爲數字,然後按順序排列 – 2014-02-12 21:52:46

回答

1

你不得不通過正則表達式是什麼究竟是「大膽」或「斜體」正式定義。

如果您認爲數字的第一組是第一個變量排序上,第二個是第二:

ORDER BY substring(col,'\d+')::int, substring(col,'\d+[^\d]+(\d+)')::int; 

或者,如果你的定義是,第一個數字是繼數字第一空間,第二個是下一個衝刺的:

ORDER BY substring(col,' (\d+)')::int, substring(col,'-(\d+)')::int; 

當然,你應該先調試這些團購運行select substring(...)

0

是的,你說的子字符串,但你必須把它轉換爲整數,以便使用數字順序(這似乎是你想要的)。

鑄造(子串(從 '\ S * \ d + - ' YOURFIELDNAME),爲整數)

它使用一個正則表達式:

未經測試,通過嘗試這個順序

\ ■對於空間 *,使其可選 \ d爲數字 +挑選一個或多個數字 - 減號

0

是的,試試這個。假設第一2個字符總是EN,再其次是3號和一個 -

select column_name from table_name order by 
substring(column_name,3,3),substring(column_name,7,length(column_name)-7) 
0

在包含在它們的期望的字典式順序中的值表創建的附加列。在表格中輸入新值時,編寫代碼(或其他表驅動的過程)以設置此列的值。添加一個性能指數。允許用戶覆蓋系統建議值。

在ORDER BY子句中使用此表將行排列到所需的序列中。否則,您將構建一個任意複雜的規則集,永遠不會迎合所有異常情況,並且維護將最終使您陷入複雜。

您可以使用正則表達式或類似的東西從原始名稱中提取建議的排序字符串。

0

您有一個格式爲「:」的字符串。

您可以通過明智地使用substring_index()來進行排序。我們的想法是將其轉換爲數字,首先通過提取值然後將其轉換爲數字。這讓你非常接近你想要的:

order by substring_index(substring_index(causule, ':', 1), -1) + 0 

問題是連字符後的部分。具有相同值「」的行都是相同的。爲了區分它們,拉出字符串的一部分的空間後:

order by substring_index(substring_index(causule, ':', 1), -1) + 0, 
     substring_index(substring_index(causule, ':', 1), -1)