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

Откуда:
Сообщений: 7
Добрый день!

Прошу помочь, есть строка вида 'ORDER_NO=E102180^RELEASE_NO=4^SEQUENCE_NO=1^'
Нужно оставить только 'RELEASE_NO=4' или просто '4' в данном случае.

Так как значения E102180 и 1(в конце) могут меняться по длине символов, то просто обрезать не выйдет.

Можно ли как то оставить только значение между ^ ^ например? Или как то еще?
27 сен 18, 15:41    [21688294]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все кроме  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1647
GraveHeaD
просто обрезать не выйдет


Не знаю, чего тут может не выйти у substr(instr(...)).
А есть еще регулярки.
27 сен 18, 15:55    [21688313]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все кроме  [new]
GraveHeaD
Member

Откуда:
Сообщений: 7
Можно пример?
С substr(instr(...) я только смог удалить все после первого ^
А вот середину, не могу понять.

Заранее спасибо
27 сен 18, 15:57    [21688317]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все кроме  [new]
Elic
Member

Откуда:
Сообщений: 29991
GraveHeaD
Нужно оставить только 'RELEASE_NO=4' или просто '4' в данном случае.
В данном случае достаточно
select '4'
RTFM regexp_substr
27 сен 18, 16:00    [21688321]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все кроме  [new]
Vadim Lejnin
Member

Откуда:
Сообщений: 7136
GraveHeaD
Можно пример?
С substr(instr(...) я только смог удалить все после первого ^
А вот середину, не могу понять.

Заранее спасибо


Для начала залезть в документацию: Database SQL Language Reference

И увидеть, что и instr имеет не два параметра а больше

with t1(s) as (select
'ORDER_NO=E102180^RELEASE_NO=444596^SEQUENCE_NO=1^' from dual
)
,t2(s,p1,p2) as (
select
 s
,instr(s,'=',1,2) as p1
,instr(s,'^',1,2) as p2
from t1
)
select substr(s,p1+1,p2-p1-1)  as test
from t2 t
/

TEST
------
444596

~
27 сен 18, 16:06    [21688326]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все кроме  [new]
GraveHeaD
Member

Откуда:
Сообщений: 7
Спасибо. Сейчас буду разбираться. :)
27 сен 18, 16:09    [21688330]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все кроме  [new]
IAmAllan
Member

Откуда:
Сообщений: 17
Если именно значение 4 нужно, то лет триста назад была написана функция
FUNCTION GetKeyValue (pStr VARCHAR2, pKey VARCHAR2, pSeparator VARCHAR2:=',') RETURN VARCHAR2 AS
  i               PLS_INTEGER;
  j               PLS_INTEGER;
  vResult         VARCHAR2(2000);
  vStr VARCHAR2 (4010):=pSeparator||pStr;
  vKey VARCHAR2 (4000):=pSeparator||pKey;
BEGIN
  i:=INSTR(vStr,vKey||'=');
  IF i>0 THEN
    j:=INSTR(vStr,pSeparator,i+1);
    i:=i+LENGTH(vKey)+1;
    vResult:=SUBSTR(vStr,i,j-i);
  END IF;
  RETURN vResult;
END;


После чего
SELECT GetKeyValue ('ORDER_NO=E102180^RELEASE_NO=4^SEQUENCE_NO=1^', 'RELEASE_NO', '^') FROM DUAL


Для коротких строк, на CLOB'ы уж самостоятельно)
27 сен 18, 22:27    [21688576]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все кроме  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
GraveHeaD,

упростите жизнь тем, кто будет это потом сопровождать
regexp_substr(s,'RELEASE_NO=(\d+)',1,1,null,1)
27 сен 18, 23:53    [21688619]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все кроме  [new]
Elic
Member

Откуда:
Сообщений: 29991
xtender
упростите жизнь тем, кто будет это потом сопровождать
PRERELEASE_NO
28 сен 18, 07:34    [21688679]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все кроме  [new]
GraveHeaD
Member

Откуда:
Сообщений: 7
Вот так в итоге сделал.

REGEXP_SUBSTR(name, 'RELEASE_NO\s*=\s*([[:alnum:],. ]+)', 1, 1, '', 1)
28 сен 18, 07:52    [21688689]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все кроме  [new]
GraveHeaD
Member

Откуда:
Сообщений: 7
xtender
GraveHeaD,

упростите жизнь тем, кто будет это потом сопровождать
regexp_substr(s,'RELEASE_NO=(\d+)',1,1,null,1)


Спасибо, так тоже работает.
Сделал для Sequence так.


Честно говоря, раньше у меня был 9й оракл, 10й только только. Регулярки только с него начинают работать.
Есть чему учится :)
28 сен 18, 07:56    [21688691]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все кроме  [new]
Vadim Lejnin
Member

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

Нужно учитывать следующее, при большом количестве операций, INSTR/SUBSTR, будут легче REGEXP_SUBSTR

Но тут как говорится нужно посмотреть, если не жмет, то сопровождать легче REGEXP_SUBSTR
28 сен 18, 15:57    [21689241]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все кроме  [new]
GraveHeaD
Member

Откуда:
Сообщений: 7
Vadim Lejnin,

Да, это я уже уточнил. В девелопере все достаточно быстро делается. А вот в клиенте, что то не особо, с другой стороны это вероятно пролема клиента, т.к. instr subst не особо то быстрее проходят.
2 окт 18, 08:19    [21692149]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все кроме  [new]
Elic
Member

Откуда:
Сообщений: 29991
GraveHeaD
В девелопере все достаточно быстро делается. А вот в клиенте, что то не особо, с другой стороны это вероятно пролема клиента, т.к. instr subst не особо то быстрее проходят.
Типичная ошибка новичков - делать выводы. Да вообще, пытаться делать выводы.
2 окт 18, 08:23    [21692150]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все кроме  [new]
GraveHeaD
Member

Откуда:
Сообщений: 7
Elic,
Уж простите, но в данной ветке (не знаю, как в других) от вас толку нет, только полемика и ссылки. Остальные помогли значительно больше.
Философствовать у меня времени нет, ибо Oracle и PLSQL далеко не первозадача для меня. Поэтому, раз Вы такой крутой - либо помогайте, либо не лезьте в размышления о выводах и новичках.
2 окт 18, 10:53    [21692302]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все кроме  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
GraveHeaD
Философствовать у меня времени нет, ибо Oracle и PLSQL далеко не первозадача для меня. Поэтому, раз Вы такой крутой - либо помогайте, либо не лезьте в размышления о выводах и новичках.


А зря. Ведь если пофилосовствовать на тему "В девелопере все достаточно быстро делается. А вот в клиенте, что то не особо" то ваяснится что девелопер при выполнении выбирает (fetch) поэкранно. Т.e. многие "не философствующие" считают что время выборки первого экрана это и есть время выполнения а в действительности SQL может выбирать десятки тысяч строк и реальное время выполнения куда больше что и показывает реальный клиент.

SY.
2 окт 18, 14:33    [21692703]     Ответить | Цитировать Сообщить модератору
 Re: Удалить все кроме  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18398
SY
а в действительности SQL может выбирать десятки тысяч строк

Не обязательно даже "выбирать".
Внутренняя кинематика процесса может быть весьма различной (требуемые записи сильно разнесены по сегменту при FTS, случился многопроходный HJ, часть разделов таблицы лежит на медленном/перегруженном шпинделе или еще какая бяка), но в предельном случае эффект "первая запись сейчас, полная выборка сильно позже" можно продемонстрировать на очень незначительном числе "выбираемых" (передаваемых клиенту) строк.
С другой стороны, "клиент" может, к примеру, физически делать построчный фетч, испытывать недостаток физической оперативной памяти под крупную выборку или иные затруднения, в т.ч. с сетью (которые, кстати, могут быть весьма себе рукотворными).
2 окт 18, 16:15    [21692915]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить