Сортировать разделенные значения в строке с помощью (Oracle) SQL - PullRequest
1 голос
/ 18 октября 2011

Скажем, у вас есть

select '9|2|6|7|5' as somedata from dual

Есть ли способ, где я мог бы сделать что-то вроде:

select
    in_string_sort('|', a.somedata)
from
    (select '9|2|6|7|5' as somedata from dual) a

Таким образом, результат будет '2|5|6|7|9'?

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

[EDIT] забыл упомянуть: это будет в Oracle 10gR2.

Ответы [ 2 ]

6 голосов
/ 18 октября 2011

Насколько я знаю, такой встроенной функции нет.Вы не говорите, какую версию, поэтому я буду считать 11g.Этот запрос должен сделать это для вас:

  1  select listagg(somedata, '|') within group (order by somedata) somedata from (
  2  with q as (select '|'||'9|2|6|7|5' as somedata from dual)
  3  select substr(somedata, instr(somedata, '|', 1, rownum) + 1, 1) somedata
  4    from q,
  5     (select 1 from q connect by level <= length(regexp_replace(somedata, '[0-9]', '')))
  6* )

SOMEDATA
------------------------------
2|5|6|7|9
3 голосов
/ 14 апреля 2017

Это старый вопрос, но я наткнулся на него в поисках решения моей конкретной проблемы. Ответ от RichardJQ хороший, но он работал только для одиночных полей (длина 1) и числовых цифр. Кроме того, я хотел упростить решение для использования функций регулярного выражения, доступных в более новых версиях Oracle. Следующий фрагмент кода будет работать для полей с любой длиной символа и буквенно-цифровыми значениями. Это решение работает с 11g или новее.

select listagg(somedata, '|') within group (order by somedata) somedata from (
with q as (select '|'||'bbb|aaa|99|9|2|6|7|5' as somedata from dual)
select
  regexp_substr(somedata, '\|([^|]+)',1,rownum,'i',1) somedata
  from q,
    (select 1 from q connect by level <= length(regexp_replace(somedata, '[^|]', '')))

)

SOMEDATA
------------------------------
2|5|6|7|9|99|aaa|bbb
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...