Сортировать буквенно-цифровой столбец в Oracle SQL - PullRequest
0 голосов
/ 13 сентября 2018

Я не эксперт по SQL. Я искал в Google о том, как добиться ниже. Мне нужно отсортировать свои записи на основе идентификатора. (сначала префикс, а затем их числовые значения)

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    | 

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Вы можете попробовать этот :

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    | 
0 голосов
/ 18 сентября 2018

Я думаю, что лучший способ сделать код понятным для следующего человека - это использовать виртуальные столбцы

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

Тогда вы можете просто "Заказать по префиксу, суффиксу desc

0 голосов
/ 13 сентября 2018

Мой 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...
...