Sql Oracle字母数字列排序
我正在按asc顺序对Oracle DB表的修订列进行排序,如下所示。 首先,要排序的数字修订(1,2,3,…)。 此后,字母数字将按以下顺序排序:A、B、B1、C、C1、C2、…、Y、Y2、Y3、Z、AA、AB、…、DA、…、ZZ等。 修订排序后,SELECT语句中的行_Number()将为每个文档#(ABC,XYZ)填充1,2,3 有关所需的表格,请参阅上载的图像 我尝试了SUBSTR、Order by等,但未能按照上述要求进行排序。 有人能帮我吗?谢谢Sql Oracle字母数字列排序,sql,string,oracle,sql-order-by,oracle12c,Sql,String,Oracle,Sql Order By,Oracle12c,我正在按asc顺序对Oracle DB表的修订列进行排序,如下所示。 首先,要排序的数字修订(1,2,3,…)。 此后,字母数字将按以下顺序排序:A、B、B1、C、C1、C2、…、Y、Y2、Y3、Z、AA、AB、…、DA、…、ZZ等。 修订排序后,SELECT语句中的行_Number()将为每个文档#(ABC,XYZ)填充1,2,3 有关所需的表格,请参阅上载的图像 我尝试了SUBSTR、Order by等,但未能按照上述要求进行排序。 有人能帮我吗?谢谢 我理解你的问题,你想把最后的修订只包含
我理解你的问题,你想把最后的修订只包含两个字符,没有数字 您可以使用条件排序:
select
t.*,
row_number() over(
partition by doc#
order by
case when regexp_like(revision, '^\w\d?$') then 0 else 1 end,
revision
) rn
from t
order by doc#, rn
正则表达式描述了一个以字母数字字符开头的字符串,可以选择后跟数字:这些修订应该放在第一位。
:
with t as (
select 'ABC' doc#, '1' revision from dual
union all select 'ABC', '2' from dual
union all select 'ABC', '3' from dual
union all select 'ABC', 'A' from dual
union all select 'ABC', 'B' from dual
union all select 'ABC', 'B1' from dual
union all select 'ABC', 'C' from dual
union all select 'ABC', 'C1' from dual
union all select 'ABC', 'D' from dual
union all select 'ABC', 'AA' from dual
union all select 'ABC', 'AB' from dual
union all select 'ABC', 'BA' from dual
union all select 'ABC', 'DA' from dual
)
select
t.*,
row_number() over(
partition by doc#
order by
case when regexp_like(revision, '^\w\d?$') then 0 else 1 end,
revision
) rn
from t
order by doc#, rn
文件#|修订| RN
:--- | :------- | -:
ABC | 1 | 1
ABC | 2 | 2
ABC | 3 | 3
ABC | A | 4
ABC | B | 5
ABC | B1 | 6
ABC | C | 7
ABC | C1 | 8
ABC | D | 9
ABC | AA | 10
ABC | AB | 11
ABC | BA | 12
ABC | DA | 13
有一个众所周知的老方法:rpad(col,max length,'0'))
例如rpad(col,max(length(col))over(),“0”请提供示例数据和所需结果。 DOC# | REVISION | RN :--- | :------- | -: ABC | 1 | 1 ABC | 2 | 2 ABC | 3 | 3 ABC | A | 4 ABC | B | 5 ABC | B1 | 6 ABC | C | 7 ABC | C1 | 8 ABC | D | 9 ABC | AA | 10 ABC | AB | 11 ABC | BA | 12 ABC | DA | 13