powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Удалить все кроме
17 сообщений из 17, страница 1 из 1
Удалить все кроме
    #39709367
GraveHeaD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

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

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

Можно ли как то оставить только значение между ^ ^ например? Или как то еще?
...
Рейтинг: 0 / 0
Удалить все кроме
    #39709378
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GraveHeaDпросто обрезать не выйдет

Не знаю, чего тут может не выйти у substr(instr(...)).
А есть еще регулярки.
...
Рейтинг: 0 / 0
Удалить все кроме
    #39709381
GraveHeaD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно пример?
С substr(instr(...) я только смог удалить все после первого ^
А вот середину, не могу понять.

Заранее спасибо
...
Рейтинг: 0 / 0
Удалить все кроме
    #39709384
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GraveHeaDНужно оставить только ' RELEASE_NO=4 ' или просто '4' в данном случае.В данном случае достаточно
Код: plsql
1.
select '4'

RTFM regexp_substr
...
Рейтинг: 0 / 0
Удалить все кроме
    #39709389
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GraveHeaDМожно пример?
С substr(instr(...) я только смог удалить все после первого ^
А вот середину, не могу понять.

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

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

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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


~
...
Рейтинг: 0 / 0
Удалить все кроме
    #39709392
GraveHeaD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Сейчас буду разбираться. :)
...
Рейтинг: 0 / 0
Удалить все кроме
    #39709557
IAmAllan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если именно значение 4 нужно, то лет триста назад была написана функция
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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;



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



Для коротких строк, на CLOB'ы уж самостоятельно)
...
Рейтинг: 0 / 0
Удалить все кроме
    #39709584
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
GraveHeaD,

упростите жизнь тем, кто будет это потом сопровождать
Код: plsql
1.
regexp_substr(s,'RELEASE_NO=(\d+)',1,1,null,1)
...
Рейтинг: 0 / 0
Удалить все кроме
    #39709621
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderупростите жизнь тем, кто будет это потом сопровождать
Код: plaintext
PRERELEASE_NO
...
Рейтинг: 0 / 0
Удалить все кроме
    #39709625
GraveHeaD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так в итоге сделал.

REGEXP_SUBSTR(name, 'RELEASE_NO\s*=\s*([[:alnum:],. ]+)', 1, 1, '', 1)
...
Рейтинг: 0 / 0
Удалить все кроме
    #39709626
GraveHeaD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtenderGraveHeaD,

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



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


Честно говоря, раньше у меня был 9й оракл, 10й только только. Регулярки только с него начинают работать.
Есть чему учится :)
...
Рейтинг: 0 / 0
Удалить все кроме
    #39709956
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GraveHeaD,

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

Но тут как говорится нужно посмотреть, если не жмет, то сопровождать легче REGEXP_SUBSTR
...
Рейтинг: 0 / 0
Удалить все кроме
    #39711414
GraveHeaD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin,

Да, это я уже уточнил. В девелопере все достаточно быстро делается. А вот в клиенте, что то не особо, с другой стороны это вероятно пролема клиента, т.к. instr subst не особо то быстрее проходят.
...
Рейтинг: 0 / 0
Удалить все кроме
    #39711415
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GraveHeaDВ девелопере все достаточно быстро делается. А вот в клиенте, что то не особо, с другой стороны это вероятно пролема клиента, т.к. instr subst не особо то быстрее проходят.Типичная ошибка новичков - делать выводы. Да вообще, пытаться делать выводы.
...
Рейтинг: 0 / 0
Удалить все кроме
    #39711512
GraveHeaD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,
Уж простите, но в данной ветке (не знаю, как в других) от вас толку нет, только полемика и ссылки. Остальные помогли значительно больше.
Философствовать у меня времени нет, ибо Oracle и PLSQL далеко не первозадача для меня. Поэтому, раз Вы такой крутой - либо помогайте, либо не лезьте в размышления о выводах и новичках.
...
Рейтинг: 0 / 0
Удалить все кроме
    #39711701
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GraveHeaDФилософствовать у меня времени нет, ибо Oracle и PLSQL далеко не первозадача для меня. Поэтому, раз Вы такой крутой - либо помогайте, либо не лезьте в размышления о выводах и новичках.

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

SY.
...
Рейтинг: 0 / 0
Удалить все кроме
    #39711806
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYа в действительности SQL может выбирать десятки тысяч строк
Не обязательно даже "выбирать".
Внутренняя кинематика процесса может быть весьма различной (требуемые записи сильно разнесены по сегменту при FTS, случился многопроходный HJ, часть разделов таблицы лежит на медленном/перегруженном шпинделе или еще какая бяка), но в предельном случае эффект "первая запись сейчас, полная выборка сильно позже" можно продемонстрировать на очень незначительном числе "выбираемых" (передаваемых клиенту) строк.
С другой стороны, "клиент" может, к примеру, физически делать построчный фетч, испытывать недостаток физической оперативной памяти под крупную выборку или иные затруднения, в т.ч. с сетью (которые, кстати, могут быть весьма себе рукотворными).
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Удалить все кроме
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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