Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Найти позицию скобки / 5 сообщений из 5, страница 1 из 1
21.10.2016, 12:17
    #39331425
4wel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти позицию скобки
Подскажите как в строке найти позицию закрывающей скобки?

например строка:
select '15+50/(10+10*(5+5))' from dual

нужно чтоб выводило что-то вида

row | in | out
1 | 7 |19
2 | 14 | 18
...
Рейтинг: 0 / 0
21.10.2016, 12:19
    #39331431
4wel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти позицию скобки
4wel,

лучше пример

select '15+50/(10+10*(5+5))+(20+30)' from dual

row | in | out
1 | 7 |19
2 | 14 | 18
3 | 21 | 26
...
Рейтинг: 0 / 0
21.10.2016, 12:34
    #39331450
цикля
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти позицию скобки
4welПодскажите как в строке найти позицию закрывающей скобки? чтением слева направо и запастись стековой памятью.
...
Рейтинг: 0 / 0
21.10.2016, 13:11
    #39331493
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти позицию скобки
4wel,

например, см. там 5590444
...
Рейтинг: 0 / 0
21.10.2016, 23:34
    #39332008
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти позицию скобки
4wel,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
SQL> select  *
  2    from  tbl
  3  /

STR
------------------------------
15+50/(10+10*(5+5))+(20+30)

with r(
       rid,
       str,
       in_pos,
       out_pos
      ) as (
             select  rowid rid,
                     regexp_replace(
                                    str,
                                    '[^()]',
                                    ' '
                                   ) str,
                     0,
                     0
               from  tbl
            union all
             select  rid,
                     regexp_replace(str,'\(( +)\)',' \1 ',1,1),
                     regexp_instr(str,'\( +\)'),
                     regexp_instr(str,'\( +\)',1,1,1) - 1
               from  r
               where regexp_instr(str,'\( +\)') != 0
           )
select  row_number() over(partition by rid order by in_pos) row_num,
        in_pos,
        out_pos
  from  r
  where in_pos > 0
  order by rid,
           in_pos
/

   ROW_NUM     IN_POS    OUT_POS
---------- ---------- ----------
         1          7         19
         2         14         18
         3         21         27

SQL> 



SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Найти позицию скобки / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]