2015-11-18 53 views
4

我使用以下查詢從表中選擇列名。Oracle中的字母數字排序

SELECT column_name FROM all_tab_cols 
WHERE table_name = 'TBL1' AND column_name like 'INFORMATION%' 
order by column_name 

的結果集是一樣

INFORMATION1 
INFORMATION10 
INFORMATION11 
INFORMATION12 
. 
. 
. 
INFORMATION2 
INFORMATION20 

現在,我希望它進行排序像

INFORMATION1 
INFORMATION2 
INFORMATION3 
INFORMATION4 
. 
. 
. 
INFORMATION19 
INFORMATION20 

如何實現這一目標而不被過多的CPU密集? 在此先感謝!

+0

如果Oracle支持,則使用數字敏感歸類。 – jarlh

回答

3

訂單首先由串長度,則通過串:

SELECT column_name 
FROM all_tab_cols 
WHERE table_name = 'TBL1' 
    AND column_name LIKE 'INFORMATION%' 
ORDER BY LENGTH(column_name), column_name; 

SqlFiddleDemo

+0

謝謝你!保存我的一天! – Avishek

1

嘗試使用此:

SELECT column_name FROM all_tab_cols 
WHERE table_name = 'TBL1' AND column_name like 'INFORMATION%' 
ORDER BY regexp_substr(column_name,'[[:alpha:]]'), 
to_number(regexp_substr(column_name, '\d+')) 

FIDDLE DEMO

2

更改ORDER BY到

ORDER BY TO_NUMBER(SUBSTR(COLUMN_NAME, 12)) 

好運。

3

如何實現這一點,而沒有太多的CPU密集?相比於舊SUBSTR

REGEX是CPU密集的和較慢。使用SUBSTR獲取數字部分,並將其用於ORDER BY

此外,由於您僅使用INFORMATION字符串篩選行,所以在數字部分只需要一個ORDER BY。

SELECT column_name FROM all_tab_cols 
WHERE table_name = 'TBL1' AND column_name like 'INFORMATION%' 
ORDER BY TO_NUMBER(SUBSTR(column_name, LENGTH('INFORMATION') +1)); 

您可以硬編碼的長度12

ORDER BY TO_NUMBER(SUBSTR(column_name, 12)) 

這裏是SQL Fiddle demo

+0

你和Bob Jarvis的答案都很好。但似乎lad2025的解決方案稍快。謝謝 – Avishek

+0

@Avishek我比較瞭解釋計劃,他們完全一樣。所以使用這兩個查詢中的任何一個,都會執行相同的操作 –