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

Откуда: Solar system
Сообщений: 137
Добрый день.

Подскажите, пожалуйста, как с помощью регулярок можно из строки следующего вида:

'1,2,1,3,4,4'

Сделать:

'1,2,3,4'

То есть фактически нужно убрать повторяющиеся значения.

Заранее благодарю.
21 дек 12, 14:17    [13665850]     Ответить | Цитировать Сообщить модератору
 Re: Regexp_replace повторяющиеся значения  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 487
alectr,

-2-. А вообще rtfm
21 дек 12, 14:23    [13665906]     Ответить | Цитировать Сообщить модератору
 Re: Regexp_replace повторяющиеся значения  [new]
-2-
Member

Откуда:
Сообщений: 15330
alectr
как с помощью регулярок
поиск на этом форуме регулярных выражений не поддерживает. так что, с помощью именно регулярок - никак.
21 дек 12, 14:24    [13665913]     Ответить | Цитировать Сообщить модератору
 Re: Regexp_replace повторяющиеся значения  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 487
mlc
alectr,

-2-. А вообще rtfm STFF
21 дек 12, 14:26    [13665928]     Ответить | Цитировать Сообщить модератору
 Re: Regexp_replace повторяющиеся значения  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
alectr,

в частном случае, когда повторы подряд идут, тожно попробовать
~
with t as 
(select '1,1,2,2,2,3,4,4' s from dual)
select s,rtrim(regexp_replace(s||',','([^,]+,)\1*','\1'),',') r
from t;
21 дек 12, 15:46    [13666791]     Ответить | Цитировать Сообщить модератору
 Re: Regexp_replace повторяющиеся значения  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
orawish
alectr,

в частном случае, когда повторы подряд идут, можно попробовать
~
with t as 
(select '1,1,2,2,2,3,4,4' s from dual)
select s,rtrim(regexp_replace(s||',','([^,]+,)\1*','\1'),',') r
from t;
21 дек 12, 15:46    [13666794]     Ответить | Цитировать Сообщить модератору
 Re: Regexp_replace повторяющиеся значения  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
orawish
orawish
alectr,

в частном случае, когда повторы подряд идут, можно попробовать
~
with t as 
(select '1,1,2,2,2,3,4,4' s from dual)
select s,rtrim(regexp_replace(s||',','([^,]+,)\1*','\1'),',') r
from t;


SQL> with t as
  2  (select '1,1,2,2,2,3,4,4,5,7,2,1' s from dual)
  3  select s,rtrim(regexp_replace(s||',','([^,]+,)\1*','\1'),',') r
  4  from t;
 
S                       R
----------------------- --------------------------------------------------------------------------------
1,1,2,2,2,3,4,4,5,7,2,1 1,2,3,4,5,7,2,1
 
SQL> 
21 дек 12, 15:58    [13666946]     Ответить | Цитировать Сообщить модератору
 Re: Regexp_replace повторяющиеся значения  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
WITH T AS
 (SELECT '1,1,2,2,2,3,4,4,5,7,2,1' S FROM DUAL)
SELECT listagg(s,',') WITHIN GROUP(ORDER BY 1) s
FROM(
SELECT DISTINCT TRIM(REGEXP_SUBSTR(S, '[^,]+', 1, ROW_NUMBER() OVER(ORDER BY 1))) S
  FROM T,
       TABLE (SELECT COLLECT(ROWNUM)
                FROM DUAL
              CONNECT BY INSTR(S, ',', 1, LEVEL - 1) > 0)
)

S
-------
1,2,3,4,5,7
21 дек 12, 16:00    [13666963]     Ответить | Цитировать Сообщить модератору
 Re: Regexp_replace повторяющиеся значения  [new]
hexcept
Member

Откуда:
Сообщений: 237
with t as (select '1,1,2,2,2,3,4,4,5,7,2,5' s from dual)
select
 trim(',' from regexp_replace(
  cast(xmlagg(xmlelement("_",w)) as varchar2(2000)),'[</_>]+',',')) str
from
(
 select distinct regexp_substr(s,'[^,]+',1,level) w from t
 connect by regexp_substr(s,'[^,]+',1,level) is not null
)
21 дек 12, 17:32    [13667722]     Ответить | Цитировать Сообщить модератору
 Re: Regexp_replace повторяющиеся значения  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
alectr,

XML рулит:

with t as (
           select '1,1,2,2,2,3,4,4,1,2,3,5' str from dual
          )
select  x.newstr
  from  t,
        xmltable(
                 'string-join(distinct-values(ora:tokenize($str,",")),",")'
                 passing ',' || t.str as "str"
                 columns newstr varchar2(2000) path '.'
                ) x
/

NEWSTR
---------
1,2,3,4,8

SQL> 


SY.
P.S. Предполагается пустых (зпт зпт) элементов в строке нет.
21 дек 12, 19:00    [13668203]     Ответить | Цитировать Сообщить модератору
 Re: Regexp_replace повторяющиеся значения  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
with t(s,r,lv)
as (select ','||replace( '1,1,2,2,2,3,4,4,5,7,2,1' ,',',',,')||',' s
          ,cast(null as varchar2(4000)) r
          ,1 lv
      from dual
 union all
    select replace(s,regexp_substr(s,',[^,]+,'))
          ,r       ||regexp_substr(s,',[^,]+')
          ,lv+1
      from t where s is not null
)
   select  max(substr(r,2)) r from t;
1,2,3,4,5,7
21 дек 12, 19:01    [13668205]     Ответить | Цитировать Сообщить модератору
 Re: Regexp_replace повторяющиеся значения  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
SY
alectr,

XML рулит:

with t as (
           select '1,1,2,2,2,3,4,4,1,2,3,5' str from dual
          )
select  x.newstr
  from  t,
        xmltable(
                 'string-join(distinct-values(ora:tokenize($str,",")),",")'
                 passing ',' || t.str as "str"
                 columns newstr varchar2(2000) path '.'
                ) x
/

NEWSTR
---------
1,2,3,4,8

SQL> 


SY.
P.S. Предполагается пустых (зпт зпт) элементов в строке нет.

последняя цифирь - это опечатка копипаста или таки результат?
если результат - то, баг?
21 дек 12, 19:06    [13668237]     Ответить | Цитировать Сообщить модератору
 Re: Regexp_replace повторяющиеся значения  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
orawish
последняя цифирь - это опечатка копипаста или таки результат?


А проверить? Конечно это опечатка копипаста.

SY.
21 дек 12, 19:36    [13668381]     Ответить | Цитировать Сообщить модератору
 Re: Regexp_replace повторяющиеся значения  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
SY
orawish
последняя цифирь - это опечатка копипаста или таки результат?


А проверить? Конечно это опечатка копипаста.

SY.

разумеется, я проверил.
ну так ведь этожеж иксимельная-джавская гнильца, с учетом неопределенности
версии-платформы-патчей-настроек-и .. прочей тучи маленьких ржавых гранат,
могло быть всяко
:)
21 дек 12, 19:44    [13668411]     Ответить | Цитировать Сообщить модератору
 Re: Regexp_replace повторяющиеся значения  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
до кучи
with t(s)
as (select ';'||replace( '1,1,2,2,2,3,4,4,5,7,2,1' ,',',';;')||';' s
      from dual
 union all
    select replace(s,regexp_substr(s,';.+?;'))
              ||','||regexp_substr(s,'[^;]+')
      from t where s like '%;%'
)   select substr(min(s),2) s from t;
21 дек 12, 20:07    [13668520]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить