Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 парсинг строки regexp_substr`ом  [new]
@le)(
Member

Откуда:
Сообщений: 125
Приветствую!

Прошу Вас помочь мне с запросом ...

у меня есть таблица в которой в строке содержатся параметры отчета и необходимо получить значение параметра sAccMask =

dBegDate = 27/05/2012 dEndDate = 29/05/2012 nDepart = nCurrtypePar = 0 nCurrencyPar = 0 nAccType = 0 nListType = 1 nViewType 0 sAccMask = '10203%18%69601' nClientPar = naBalAcc = <Array> sCorrAccMask = '%'


пробую написать так
regexp_substr(a.reportparams, '^sAccMask\s=\s\''\s+')
20 июн 12, 10:29    [12743613]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
@le)(
Member

Откуда:
Сообщений: 125
пока ждал нашел один из вариантов решения

regexp_substr(a.reportparams, '\''(.*)\''')
20 июн 12, 10:40    [12743719]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
AmKad
Member

Откуда:
Сообщений: 5222
@le)(,

Для 11 версии:
regexp_substr(a.reportparams, 'sAccMask = ''(.*?)''', 1, 1, 'i', 1)
20 июн 12, 11:25    [12744170]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
AmKad
Member

Откуда:
Сообщений: 5222
@le)(,

Без регэкспов
select substr(rs3, 1, instr(rs3, '''') - 1) rs
from
   (select substr(reportparams, nullif(instr(reportparams, 'sAccMask = '''), 0) + 12) rs3
    from a
   );
20 июн 12, 11:52    [12744511]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
hexcept
Member

Откуда:
Сообщений: 237
что-нить типа
regexp_substr(reportparams,'sAccMask *= *\S+')
regexp_substr(reportparams,'dEndDate *= *\S+')
regexp_substr(reportparams,'naBalAcc *= *\S+')
20 июн 12, 12:57    [12745111]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: парсинг строки regexp_substr`ом  [new]
Irhen
Member

Откуда:
Сообщений: 374
up!!!
Снова парсинг строки...
Помогите правильно составить выражение, чтоб однозначно правильно получать 1-е, 2-е вхождение строки, разделенной знаком-разделителем. Мое выражение рушится, если строка начинается с разделителя.
SELECT
 REGEXP_SUBSTR (':DDD:KKK:SSSS:XXXX'
              , '[^:]+'
              , 1
              , 1
              ) "1-й элемент"

,REGEXP_SUBSTR (':DDD:KKK:SSSS:XXXX'
              , '[^:]+'
              , 1
              , 2
              ) "2-й элемент"              
FROM DUAL


Первый элемент в этом примере должен выводиться быть пустым. Строка может и не начинаться на разделитель - тогда мое выражение выдает ожидаемый результат.
Спасибо
21 июл 13, 19:00    [14595521]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10050
'([^:]|^)+'

SY.
P.S. Это не поможет для пустых элементов в середине/конце. Так-что уточни.
21 июл 13, 19:42    [14595696]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
Кристобаль Хозевич
Member

Откуда: тутошний
Сообщений: 250
Irhen,

звёздочку вместо плюса
21 июл 13, 20:26    [14595861]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10050
Кристобаль Хозевич
Irhen,

звёздочку вместо плюса


Ну разве что в качестве бижутерии

SELECT  LEVEL,
        REGEXP_SUBSTR ('1:2::4:5','[^:]*',1,level)
  FROM  DUAL
  CONNECT BY LEVEL <= 5
  ORDER BY LEVEL
/

     LEVEL REGEXP_S
---------- --------
         1 1
         2
         3 2
         4
         5

SQL>


SY.
21 июл 13, 20:35    [14595900]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10050
Кристобаль Хозевич
звёздочку вместо плюса


Для 11G:

SELECT  LEVEL,
        REGEXP_SUBSTR (':2:3:::6::','([^:]*):',1,level,null,1)
  FROM  DUAL
  CONNECT BY LEVEL <= 8
  ORDER BY LEVEL
/

     LEVEL REGEXP_SUB
---------- ----------
         1
         2 2
         3 3
         4
         5
         6 6
         7
         8

8 rows selected.

SQL>


Для 10G:

SELECT  LEVEL,
        RTRIM(REGEXP_SUBSTR (':2:3:::6::','[^:]*:',1,level),':')
  FROM  DUAL
  CONNECT BY LEVEL <= 8
  ORDER BY LEVEL
/

     LEVEL RTRIM(REGE
---------- ----------
         1
         2 2
         3 3
         4
         5
         6 6
         7
         8

8 rows selected.

SQL>


SY.

Сообщение было отредактировано: 21 июл 13, 20:43
21 июл 13, 20:42    [14595923]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10050
Oops. Не учел строку с одним элементом. Исправленный вариант

SELECT  LEVEL,
        REGEXP_SUBSTR (':2:3:::6::','([^:]*)(:|$)',1,level,null,1)
  FROM  DUAL
  CONNECT BY LEVEL <= 8
  ORDER BY LEVEL
/


SY.
21 июл 13, 20:49    [14595947]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
Irhen
Member

Откуда:
Сообщений: 374
без
CONNECT BY 
никак???
22 июл 13, 11:50    [14598041]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Irhen
без
CONNECT BY 
никак???

отчего же - джоин с пивотом или рекурсивный факторинг или XML или модель или пайплайн или ..
22 июл 13, 12:04    [14598191]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
Irhen
Member

Откуда:
Сообщений: 374
orawish,

...спасибо
22 июл 13, 14:22    [14599196]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
Дурацкая клавиатура
Guest
Добрый день!
Прошу помочь в этом:
Есть поле, в котором хранятся данные вида: "abcdef,fedcba", где количество символов до и после запятой непостоянно и может варьироваться. Надо вытащить строку до запятой и после.
Мне приходит в голову только SUBSTR + INSTR. Но немного смущает такой вариант решения, возможно, при помощи какого-нибудь REGEXP_SUBSTR это осуществимо, но проблема в том, что я его не знаю, а поиск результатов не приносит.
Заранее спасибо
10 окт 13, 12:36    [14949840]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
zhal
Member

Откуда: Киев-Харьков
Сообщений: 647
Дурацкая клавиатура,

А чего смущает?
with t as (select 'abcdef,fedcba' str from dual)
select substr(str,1,instr(str,',')-1) str1, substr(str,instr(str,',')+1) str2 from t
Надо отметить, что REGEXP работает как правило медленнее SUBSTR/INSTR
10 окт 13, 12:41    [14949876]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
zhal
Member

Откуда: Киев-Харьков
Сообщений: 647
Ну если очень хочется
with t as (select 'abcdef,fedcba' str from dual)
select regexp_substr(str,'^\w+') str1, regexp_substr(str,'\w+$') str2 from t
10 окт 13, 12:45    [14949901]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
Дурацкая клавиатура
Guest
zhal,

Не хотелось бы писать индийский код, когда можно пользоваться специально созданными функциями.
Спасибо
10 окт 13, 12:45    [14949905]     Ответить | Цитировать Сообщить модератору
 Re: парсинг строки regexp_substr`ом  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Дурацкая клавиатура
zhal,

Не хотелось бы писать индийский код, когда можно пользоваться специально созданными функциями.
Спасибо

регулярные выражения созданы специально, но .. не для вашей задачи.
и нет никакой доблести в том, чтобы просаживать производительность на порядок (как минимум) по соображениям от фонаря
10 окт 13, 12:55    [14950005]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить