2013-09-19 4 views
1

У меня есть строкаЗаказать строку в оракула

vl_str_uniq = D01,D08,D02,D05,D31,D24..., и я хотел бы выполнить ORDER BY на этом ON Ниже dynamic query

 
'SELECT a.trcode, 
       townname, 
        DAYS COUNT,' 
      || vl_str_uniq 
      || ' FROM MTXNMGRMTPDT3 a 
      WHERE a.entryno =' 
      || p_entryno 
      || ' AND a.geocode = ' 
      || p_geocode 
      || ' AND a.bu =' 
      || p_bu 
      || ' AND a.recstat=0';

то выход будет как

trcode || towname || dayscount || D01 || D05 || D09 || D03 ..

Или что неупорядоченная строка была построена в

vl_str_uniq

Так я хочу D01 || D03 || D05 || D09. .. быть заказаны в вышеуказанном запросе?

Как я могу достичь этого любым возможным способом?

+0

Чтобы удовлетворить третье и последнее требование - вы должны «вырезать строку» после третьего появления «||», (подсказка: вы должны использовать другое регулярное выражение для '||' и условие: 'where level> ...') – alfasin

ответ

2
select * from (
select regexp_substr('D01,D08,D02,D05,D10,D11,D12,D20,D21,D22,D30,D31','[^,]+', 1, level) as split from dual 
connect by regexp_substr('D01,D08,D02,D05,D10,D11,D12,D20,D21,D22,D30,D31', '[^,]+', 1, level) is not null 
) order by split asc 

ВЫВОД:

SPLIT 
D01 
D02 
D03 
D04 
D10 
D11 
D12 
D20 
D21 
D22 
D30 
D31 

Ссылка на fiddle

Хорошее объяснение REGEXP_SUBSTR можно найти here.
Хорошее объяснение connected by можно найти here

Краткое объяснение:

select regexp_substr('D01,D08,D02,D05,D10,D11,D12,D20,D21,D22,D30,D31','[^,]+', 1, 1) as split from dual 

возвращает первый матч подстроки D01. Если изменить последний параметр 2:

select regexp_substr('D01,D08,D02,D05,D10,D11,D12,D20,D21,D22,D30,D31','[^,]+', 1, 2) as split from dual 

он вернется второй матч: D08 и т.д.

Connected by рекурсивно «заказные» элементы в соответствии с их «иерархии» (которая является порядок они появляются в строке - в нашем примере). Этот порядок можно просмотреть с помощью параметра level. Изменение запроса:

select level, regexp_substr('D01,D08,D02,D05,D10,D11,D12,D20,D21,D22,D30,D31','[^,]+', 1, level) as split from dual 
connect by regexp_substr('D01,D08,D02,D05,D10,D11,D12,D20,D21,D22,D30,D31', '[^,]+', 1, level) is not null 

выхода будут подстрок в соответствии с их «уровнем»:

LEVEL SPLIT 
1  D01 
2  D08 
3  D02 
4  D05 
5  D10 
6  D11 
7  D12 
8  D20 
9  D21 
10  D22 
11  D30 
12  D31 

После того как мы воспользовались этим уровнем, чтобы отобразить все подстроки рекурсивны, мы «обернуть» запрос с другим запросом - для order by (естественный порядок строк).

+0

отсутствует 'order by' –

+0

Я обновил свой вопрос выше. Пожалуйста, смотрите, можете ли вы помочь. – kushalvm

+0

@ kushal обновил мой ответ и скрипку. Наслаждайтесь! – alfasin

Смежные вопросы