Как получить отсортированный результат по адресу проживания в Oracle 10g? - PullRequest
4 голосов
/ 10 августа 2011

Я хочу запросить базу данных Oracle 10g и получить результат на основе адреса места жительства в порядке возрастания или убывания.Таким образом, проблема заключается в построении адресов в форме 110C или 200D, поэтому в соответствии с sql "order by" asc или desc я получаю результат как 200D до 20. Например, если адреса равны 10 110 112 200D 232 9520 100A 1050 944

В порядке возрастания это приведет к: -

 10 100 100A 1050 110 112 20 200D 232 944 95

Проблема в том, что в адресах есть символы, я не могу считать их целыми числами иличисло, они должны рассматриваться как строка.

Ответы [ 5 ]

5 голосов
/ 10 августа 2011

Используйте регулярные выражения:

Внимание! Потенциальный нерабочий код впереди. У меня нет экземпляра Oracle, чтобы проверить его на данный момент.

SELECT YourAddress
FROM YourTable
order by TO_NUMBER(REGEXP_SUBSTR(AddressColumn, '^[0-9]+'));

REGEXP_SUBSTR найдет подстроку номера, которая должна начинать адрес, преобразовать его в действительное число и упорядочить по нему.

Предупреждение: вам придется улучшить запрос, чтобы обрабатывать случаи, когда число не будет присутствовать. Однако этот ответ поможет вам очень хорошо начать.

Если вам необходимо настроить запрос, вот ресурсы, которые вы должны использовать:

И, да, REGEXP_SUBSTR доступно в Oracle 10g.

2 голосов
/ 10 августа 2011

Решения на основе регулярных выражений более элегантны. Но если вы хотите сначала отсортировать числовой компонент, используя числовую сортировку, а затем отсортировать символьный компонент, используя сортировку символов, вы также можете использовать функцию TRANSLATE.

SQL> ed
Wrote file afiedt.buf

  1  with x as (
  2    select '10' addr from dual union all
  3    select '100' from dual union all
  4    select '100A' from dual union all
  5    select '1050' from dual union all
  6    select '110' from dual union all
  7    select '200D' from dual union all
  8    select '20' from dual
  9  )
 10  select addr,
 11         to_number( translate( addr,
 12                               '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ',
 13                               '1234567890' ) ) addr_num,
 14         translate( addr,
 15                    'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890',
 16                    'ABCDEFGHIJKLMNOPQRSTUVWXYZ') addr_str
 17    from x
 18   order by to_number( translate( addr,
 19                                  '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ',
 20                                  '1234567890' ) ),
 21            translate( addr,
 22                       'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890',
 23*                      'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
SQL> /

ADDR   ADDR_NUM ADDR_STR
---- ---------- ----------------
10           10
20           20
100A        100 A
100         100
110         110
200D        200 D
1050       1050

7 rows selected.
1 голос
/ 10 августа 2011

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

В Oracle 11 есть функция REGEXP_SUBSTR, которую можно использовать для достижения этой цели, но я не уверен, что она существует в Oracle 10g.

0 голосов
/ 10 августа 2011

У вас есть два основных варианта, которые мне известны:
1. Принудительно выставить поле в согласованном формате
2. Отделите числовые и нечисловые части от

Для первого варианта вы должны изменить '10' на '00010-' и '100A' на '00100A' и т. Д. Затем они естественным образом упорядочат себя.

Для второго варианта вы должны изменить '10' на (10,''), а '100A' на (100,'A') и т. Д. Затем упорядочить по двум частям (числовому и не числовому) отдельно.


В любом случае, вам нужно знать (или рассказать нам) немного больше об окончательных характеристиках данных. (Является ли шаблон всегда [числовой] [альфа], всегда ли часть [альфа] длиной 1 символ? У вас когда-нибудь были Имена зданий и т. Д., И т. Д.?)

0 голосов
/ 10 августа 2011

У меня нет опыта работы с оракулом, но обычно с SQL может помочь что-то подобное:

ORDER BY CAST(house AS integer), house

Таким образом, в основном вы сначала упорядочиваете по целой части поля (CAST должен игнорировать все конечные нечисловые символы), и если они одинаковые, он должен сравнивать их как строку, так что 100A будет раньше 100b

Очевидно, это не будет работать в Oracle. Смотрите комментарии

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