在 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
我不是 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