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

Откуда:
Сообщений: 23
Имеются строки вида
XXXX
XXXX_1
XXXX_2
....
XXXX_10
Y_YY
Y_YY_1
....
Y_YY_123
ZZZZZ
....
ZZZZZ_4
Надо сгруппировать по буквам, отбросив цифры после _.
Как попроще сделать? Есть мысль воспользоваться regexp, но я его плохо знаю.
8 окт 08, 10:32    [6277523]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
Elic
Member

Откуда:
Сообщений: 29976
Гость++
отбросив цифры после _
rtrim(s, '0123456789')
8 окт 08, 10:38    [6277567]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
Гость++
Member

Откуда:
Сообщений: 23
Прошу прощения, не точно написал задачу.
Уточнение: в XXX могут быть цифры, поэтому просто rtrim не пойдет. После подчеркивания только цифры.
8 окт 08, 10:41    [6277596]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
Elic
Member

Откуда:
Сообщений: 29976
regexp_substr(s, '_[0-9]+$')
8 окт 08, 10:47    [6277631]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
Добрый Э - Эх
Guest
Гость++
Надо сгруппировать по буквам, отбросив цифры после _.
Как попроще сделать? Есть мысль воспользоваться regexp, но я его плохо знаю.
А можно и по старинке:
with t as (
select 'XXXX' as str from dual union all
select 'XXXX_1' as str from dual union all
select 'XXXX_2' as str from dual union all
select 'XXXX_10' as str from dual union all
select 'Y_YY' as str from dual union all
select 'Y_YY_1' as str from dual union all
select 'Y_YY_123' as str from dual union all
select 'ZZZZZ' as str from dual union all
select 'ZZZZZ_4' as str from dual 
)
--
--
--
select str, 
       nvl(substr(str,1,instr(str,'_', -1,1) - 1),str) x_str
  from t

Query finished, retrieving results...

  STR      X_STR
--------   -----
XXXX       XXXX
XXXX_1     XXXX
XXXX_2     XXXX
XXXX_10    XXXX
Y_YY       Y
Y_YY_1     Y_YY
Y_YY_123   Y_YY
ZZZZZ      ZZZZZ
ZZZZZ_4    ZZZZZ

9 row(s) retrieved
8 окт 08, 11:02    [6277745]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
Гость++
Member

Откуда:
Сообщений: 23
Спасибо большое :)
Как хорошо, что на sql.ru такие зубры есть.
P.S. substr на _replace поменял.
8 окт 08, 11:06    [6277778]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
Гость++
Member

Откуда:
Сообщений: 23
Для Добрый Э - Эх
Вариант Elic'a больше мне нравится - проще он и читабльней.
8 окт 08, 11:08    [6277797]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
Добрый Э - Эх
Guest
Гость++
Для Добрый Э - Эх
Вариант Elic'a больше мне нравится - проще он и читабльней.
Ну, это кому как привычнее...
Вдобавок ко всему, у меня нет под рукой ни одного инстанса 10g. Вот и делаю все под "девятку" ;)
8 окт 08, 11:37    [6278058]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Гость++
Прошу прощения, не точно написал задачу.
Уточнение: в XXX могут быть цифры, поэтому просто rtrim не пойдет. После подчеркивания только цифры.
SQL> select rtrim('12345_54321','0123456789') from dual;

RTRIM('12345_54321','012345678
------------------------------
12345_

SQL> 
8 окт 08, 11:58    [6278228]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
Гость++
Member

Откуда:
Сообщений: 23
Для andrey_anonymous, для XXX строк не подойдет, а так да - было бы еще проще.
8 окт 08, 12:03    [6278282]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
Добрый Э - Эх
Guest
andrey_anonymous
Гость++
Прошу прощения, не точно написал задачу.
Уточнение: в XXX могут быть цифры, поэтому просто rtrim не пойдет. После подчеркивания только цифры.
SQL> select rtrim('12345_54321','0123456789') from dual;

RTRIM('12345_54321','012345678
------------------------------
12345_

SQL> 

а если ХХXXX будет что-то типа X1234 ?
Тогда группа будет неправильной, так как rtrim убъет цифры до первого нечислового символа, и вместо группы Х1234 получим группу Х, что явно не удовлетворяет исходным требованиям автора ;)
8 окт 08, 12:05    [6278297]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Гость++
Для andrey_anonymous, для XXX строк не подойдет, а так да - было бы еще проще.

Не понял, если честно.
Гость++
Надо сгруппировать по буквам, отбросив цифры после _.

предложенный rtrim отбрасывает именно цифры "после _", не затрагивая цифирь в подстроках...
8 окт 08, 12:17    [6278407]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Добрый Э - Эх
что явно не удовлетворяет исходным требованиям автора ;)

А что, автор где-то объявил требования к поведению при отсутствии подчерка?
8 окт 08, 12:20    [6278438]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
Добрый Э - Эх
Guest
andrey_anonymous
А что, автор где-то объявил требования к поведению при отсутствии подчерка?
Вроде как вот тут, хоть и смутно.
8 окт 08, 12:26    [6278489]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Добрый Э - Эх
andrey_anonymous
А что, автор где-то объявил требования к поведению при отсутствии подчерка?
Вроде как вот тут, хоть и смутно.

Я лично несколько затрудняюсь сформулировать искомое требование в контексте Вашего примера на основании этой ссылки...
8 окт 08, 12:28    [6278504]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
Добрый Э - Эх
Guest
andrey_anonymous
Гость++
Для andrey_anonymous, для XXX строк не подойдет, а так да - было бы еще проще.

Не понял, если честно.
IMHO, автор как раз пытается обяснить, что может быть ситуация Х1234 и в этом случае группа так и должна оставаться Х1234, а не усекаться до Х
8 окт 08, 12:28    [6278507]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
Добрый Э - Эх
Guest
Впрочем, какая разница. Автор всё равно остановил свой выбор на варианте с регулярками от Elic'a
8 окт 08, 12:31    [6278525]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Гость++
Спасибо большое :)
Как хорошо, что на sql.ru такие зубры есть.
P.S. substr на _replace поменял.

а можно и сабстром ~
regexp_substr(s,'[^_]+')
8 окт 08, 13:33    [6279088]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
Elic
Member

Откуда:
Сообщений: 29976
orawish
а можно и сабстром ~
regexp_substr(s,'[^_]+')
автор
s := 'Y_YY_1'
8 окт 08, 13:41    [6279168]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Elic
orawish
а можно и сабстром ~
regexp_substr(s,'[^_]+')
автор
s := 'Y_YY_1'

да. был не прав..
значит ~ так
with t as (
select 'XXXX'   as s from dual union all
select 'XXXX_1'      from dual union all
select 'XXXX_2'      from dual union all
select 'XXXX_10'     from dual union all
select 'Y_YY'        from dual union all
select 'Y_YY1_11'    from dual union all
select 'Y_YY_1'      from dual union all
select 'Y_YY_123'    from dual union all
select 'ZZZZZ'       from dual union all
select 'ZZZZZ_4'     from dual 
)
select s
      ,regexp_substr(s,'(_?[[:alnum:]]*[[:alpha:]][[:alnum:]]*)+') r
  from t;
8 окт 08, 14:14    [6279426]     Ответить | Цитировать Сообщить модератору
 Re: как сгрупировать по подстроке? (regexp?)  [new]
Elic
Member

Откуда:
Сообщений: 29976
orawish
regexp_substr(s,'(_?[[:alnum:]]*[[:alpha:]][[:alnum:]]*)+')
Хитро :)
8 окт 08, 14:39    [6279657]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить