我使用 order by 运行查询,但我的列不是想要的顺序
我想要这样的:
产品
PROD_1
PROD_2
PROD_3
PROD_4
PROD_5
PROD_6
PROD_7
PROD_8
PROD_9
PROD_10
但它给了我这个
产品
PROD_1
PROD_10
PROD_2
PROD_3
PROD_4
PROD_5
PROD_6
PROD_7
PROD_8
PROD_9
您需要为每个位置添加一个 0,例如数字 1-99 的 01 或 1-999 的 001。或者,您必须拆分数值并在两个不同的列上进行排序。
您将需要排序两次(注意我从 regexp_replace 更改为 regexp_substr 以允许空返回值)
with
a as (
select 'PROD_1' product from dual union all
select 'PROD_10' product from dual union all
select 'PROD_2' product from dual union all
select 'PROD_3' product from dual union all
select 'PROD_4' product from dual union all
select 'PROD_5' product from dual union all
select 'PROD_6' product from dual union all
select 'PROD_7' product from dual union all
select 'PROD_8' product from dual union all
select 'PROD_9' product from dual union all
select 'DECEAD_1' product from dual union all
select 'DECEAD_10' product from dual union all
select 'DECEAD_2' product from dual union all
select 'DECEAD_20' product from dual union all
select 'TREE_FROG' product from dual
)
select PRODUCT
, regexp_substr(product,'[^[:digit:]]*') --return all non numeric
, regexp_substr(product,'[0-9]+')
from a
order by regexp_substr(product,'[^[:digit:]]*') ,
TO_NUMBER(regexp_substr(product,'[0-9]+')) --note explicit numeric cast
;
您正在尝试按字典顺序对实际上部分数字的东西进行排序。您可以添加零前缀(即 PROD_000001),但这很脆弱。在实际应用中,我假设 Prod 10 实际上在时间上晚于 Prod 1,因此您将按创建日期时间排序。
SELECT to_number(substr(colname,INSTR(column_name,'_')+1))) prodno, column_name
from table_name
order by prodno
不是很优雅的解决方案,但这应该可行。(因为我没有访问 Oracle 的权限,函数的参数可能需要调整。)首先获取_上的位置,使用它使用子字符串获取数字,然后将其转换为数字。如果表大小很大,您可能还需要查看性能