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

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

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

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

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

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

RTFM regexp_substr
...
Рейтинг: 0 / 0
27.09.2018, 16:06
    #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
27.09.2018, 16:09
    #39709392
GraveHeaD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удалить все кроме
Спасибо. Сейчас буду разбираться. :)
...
Рейтинг: 0 / 0
27.09.2018, 22:27
    #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
27.09.2018, 23:53
    #39709584
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удалить все кроме
GraveHeaD,

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

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

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



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


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

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

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

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

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

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


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