在 Oracle SQL 中对字母数字列进行排序

Sort Alphanumeric column in Oracle SQL

我不是 SQL 专家。我一直在搜索 google 如何实现以下目标。 我需要根据 ID 对我的记录进行排序。 (前缀在前,数值在后)

Table: CUSTOMER_TRANS

| ID       | Name   | Date       |
|==========|========|============|
|CP-091435 | Ola    | 01-01-2010 |
|WM-183258 | Tor    | 09-09-2001 |
|CP-109056 | Jess   | 03-03-2003 |


SELECT * FROM CUSTOMER_TRANS ORDER BY substr(ID, 4) desc;

我需要先对 2 前缀(例如 ES)进行排序,然后对数值进行排序。 但是,我的SQL上面returns数值最高的只有WM-183258。 预期的结果是 returns 首先是 "CP" 前缀和最高的数值,例如以下。希望有人能给我一些启发。

预期结果:

| ID       | Name   |
|==========|========|
|CP-109056 | Ola    | 
|CP-091435 | Jess   | 
|WM-183258 | Tor    | 

我的 PL/SQL 很生疏,但你应该可以使用类似

的东西
... ORDER BY substr(ID, 1, 2) ASC, substr(ID, 4) DESC

甚至更好 mathguy

... ORDER BY substr(ID, 1, 2) ASC, ID DESC

即前两个字符升序排列,其余字符降序排列。


从性能的角度来看,这可能不是最佳选择。我会考虑将 ID 分解成多个部分,例如

ID_PREFIX CHAR(2),
ID_SUFFIX CHAR(6) -- or a numeric type, whatever is appropriate

并在两者上创建您的主键。这使得分组和排序以及显示变得容易,您可以使用

SELECT ID_PREFIX || '-' || ID_SUFFIX AS ID...

你可以试试 this one :

with CUSTOMER_TRANS(Id,Name) as
(
 select 'CP-091435','Ola' from dual union all    
 select 'WM-183258','Tor' from dual union all
 select 'CP-109056','Jess' from dual   
)
select *
  from CUSTOMER_TRANS
 order by substr(ID, 1, 2), substr(ID,4,length(ID)) desc;

| ID       | Name   |
|==========|========|
|CP-109056 | Jess   | 
|CP-091435 | Ola    | 
|WM-183258 | Tor    | 

我认为让下一个人可以理解代码的最好方法是使用虚拟列

Alter table CUSTOMER_TRANS add(prefix generated always as (substr(longid,1,2)) virtual,
                     suffix generated always as (substr(longid,4)) virtual);

那你就可以"Order by prefix, suffix desc