我正在使用以下查询从表中选择列名。
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 :(得分: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)
与旧 SUBSTR 相比,如何在没有太多cpu强烈的情况下实现这一目标?
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; -->甲骨文