Oracle中的字母数字排序

时间:2015-11-18 13:10:33

标签: sql database oracle sorting

我正在使用以下查询从表中选择列名。

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强度的情况下实现这一目标? 提前谢谢!

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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));

您可以将 LENGTH 硬编码为12

ORDER BY TO_NUMBER(SUBSTR(column_name, 12))

以下是 SQL Fiddle demo

答案 2 :(得分:2)

将ORDER BY更改为

ORDER BY TO_NUMBER(SUBSTR(COLUMN_NAME, 12))

祝你好运。

答案 3 :(得分: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

答案 4 :(得分:0)

SELECT column FROM table ORDER BY CAST(column AS DECIMAL), column; -->mysql

SELECT column FROM table ORDER BY CAST(regexp_substr(column, '^\d*') AS DECIMAL), column; -->甲骨文