Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle字母数字列排序_Sql_String_Oracle_Sql Order By_Oracle12c - Fatal编程技术网

Sql Oracle字母数字列排序

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等,但未能按照上述要求进行排序。 有人能帮我吗?谢谢 我理解你的问题,你想把最后的修订只包含

我正在按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