我不是SQL专家。我一直在谷歌搜索如何实现以下。我需要根据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只返回数值最高的WM-183258。预期的结果是首先返回"CP“前缀,然后返回数值最高的值,例如下面。希望有人能给我点时间。
预期结果:
| ID | Name |
|==========|========|
|CP-109056 | Ola |
|CP-091435 | Jess |
|WM-183258 | Tor |
发布于 2018-09-12 18:40:20
我的PL/SQL非常生疏,但是您应该能够使用以下内容
... ORDER BY substr(ID, 1, 2) ASC, substr(ID, 4) DESC
,甚至如 马斯盖所指出的更好
... 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...
发布于 2018-09-12 18:43:04
您可以尝试这一个:
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 |
发布于 2018-09-18 10:18:55
我认为让下一个人理解代码的最好方法是使用虚拟列。
Alter table CUSTOMER_TRANS add(prefix generated always as (substr(longid,1,2)) virtual,
suffix generated always as (substr(longid,4)) virtual);
然后您就可以“按前缀、后缀desc排序”。
https://stackoverflow.com/questions/52305834
复制