Пользовательская сортировка Oracle - PullRequest
3 голосов
/ 15 июня 2010

Запрос ...

select distinct name from myTable 

возвращает набор значений, которые начинаются со следующих последовательностей символов ...

ADL*
FG*
FH*
LAS*
TWUP*

Где '*' - остаток строки.

Я хочу сделать такой заказ следующим образом ...

ADL*
LAS*
TWUP*
FG*
FH*

Но тогда я также хочу отсортировать каждое имя в стандартном порядке по моде. Итак, пример, если у меня есть следующие значения

LAS-21A
TWUP-1
FG999
FH3
ADL99999
ADL88888
ADL77777
LAS2

Я хочу, чтобы это было отсортировано вот так ...

ADL77777
ADL88888
ADL99999
LAS2
TWUP-1
FG999
FH3

Сначала я думал, что смогу выполнить эти переходы, выполняя заказ путем декодирования (бла), с какой-то хитростью внутри декодера, но я не смог этого сделать. Есть идеи?

Ответы [ 2 ]

9 голосов
/ 16 июня 2010

тупой и многословный, но должен работать:

select name, case when substr (name, 1, 3) = 'ADL'  then 1  
                  when substr (name, 1, 3) = 'LAS'  then 2
                  when substr (name, 1, 4) = 'TWUP' then 3
                  when substr (name, 1, 2) = 'FG'   then 4
                  when substr (name, 1, 2) = 'FH'   then 5
                  else 6
             end SortOrder
from myTable
order by 2, 1;

Не уверен, что 6 - правильное место для сортировки других предметов, но очевидно, как это исправить. По крайней мере, понятно, что происходит, даже если я понятия не имею, почему вы делаете это таким образом.

РЕДАКТИРОВАТЬ : Если это единственные значения, вы можете изменить строки 4 и 5:

select name, case when substr (name, 1, 3) = 'ADL'  then 1  
                  when substr (name, 1, 3) = 'LAS'  then 2
                  when substr (name, 1, 4) = 'TWUP' then 3
                  when substr (name, 1, 1) = 'F'    then 4
                  else 6
             end SortOrder
from myTable
order by 2, 1;

ДРУГОЕ РЕДАКТИРОВАНИЕ : И снова, если это единственные значения, вы можете упростить еще больше. Поскольку только один не соответствует порядку серии F *, вы можете принудительно завершить их и использовать фактическую первую букву для всех остальных. Это проще, но слишком сильно зависит от точных значений для моих предпочтений. С другой стороны, он удаляет многие, казалось бы, ненужные вызовы substr:

select name, case when substr (name, 1, 1) = 'F'  then 'Z'
                  else name
             end SortOrder
from myTable
order by 2, 1;
3 голосов
/ 16 июня 2010

Проблема в том, что ваш префикс содержит переменное количество символов.Это хорошее время для развертывания регулярных выражений (если у вас 10g или выше).

SQL> select cola
  2  from t34
  3  order by decode( regexp_substr(cola, '[[:alpha:]]+')
  4                   , 'ADL' , 10
  5                    , 'LAS',  20
  6                    , 'TWUP',  30
  7                    , 'FG' , 40
  8                    , 'FH' , 50
  9                    , 60 )
 10           , cola
 11  /

COLA
----------
ADL77777
ADL88888
ADL99999
LAS-21A
LAS2
TWUP-1
FG999
FH3

8 rows selected.

SQL>

Если в более ранних версиях Oracle мы можем использовать функцию OWA_PATTERN.AMATCH () с тем же эффектом:

SQL> select cola
  2  from t34
  3  order by decode( owa_pattern.amatch(cola, 1, '^[A-Z]+')
  4                   , 'ADL' , 10
  5                    , 'LAS',  20
  6                    , 'TWUP',  30
  7                    , 'FG' , 40
  8                    , 'FH' , 50
  9                    , 60 )
 10           , cola
 11  /

COLA
----------
ADL77777
ADL88888
ADL99999
FG999
FH3
LAS-21A
LAS2
TWUP-1

8 rows selected.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...