2014-02-10 5 views
2

У меня есть строка как «1,1,2,3,4,4,5,6,6,7», хранящаяся в столбце. Мне нужно отдельное значение, разделенное запятыми, как вывод с использованием SQL-запроса.Отдельные значения, разделенные запятой, в оракуле

например. Для заданного строкового вывода должно быть «1,2,3,4,5,6,7». На выходе не сохраняется дубликация.

+0

Привет, не уверен, что делает это с оракулом является хорошим способом пойти. Не могли бы вы обеспечить однозначность при вставке или синтаксический анализ своей клиентской стороны? –

+0

Создайте функцию, которая принимает значение этого столбца в качестве параметра и возвращает строку с удалением дубликатов. –

ответ

0

Мы можем сделать это с помощью regex_substr и подключиться. Пожалуйста, попробуйте это.

select distinct num from 
(SELECT REGEXP_SUBSTR('1,1,2,3,4,4,5,6,6,7','[^,]+',1,level) as num 
FROM DUAL 
CONNECT BY LEVEL<= LENGTH(REGEXP_REPLACE('1,1,2,3,4,4,5,6,6,7','[^,]',''))); 

Без регулярных выражений: После разъяснения в вопросе

with t as (SELECT distinct substr(replace('1,1,2,3,4,4,5,6,6,7',','),level,1)||',' as num 
FROM DUAL 
CONNECT BY LEVEL<= LENGTH('1,1,2,3,4,4,5,6,6,7') - LENGTH(REPLACE('1,1,2,3,4,4,5,6,6,7' , ','))+1) 
select listagg(num) within group (order by num) from t; 
+0

'ORA-00904:« REGEXP_REPLACE »: недопустимый идентификатор' встречается в Oracle – Sam1604

+0

, какую версию oracle вы используете? Я думаю, что regexp для 10g – arunb2w

+0

Я использую Oracle-9i – Sam1604

3

без регулярных выражений:

WITH t AS 
(SELECT '1,2,3,3,3,4,5,6,7,7,7,7' AS num FROM dual 
) 
SELECT DISTINCT 
     SUBSTR (
     num 
     , instr(num, ',', 1, level) + 1 
     , instr(num, ',', 1, level + 1) - instr(num, ',', 1, level) - 1) 
     AS numbers 
FROM (select ','||num||',' num from t) 
CONNECT BY level <= length(num) - length(replace(num,',')) -1 

с регулярным выражением:

SELECT DISTINCT REGEXP_SUBSTR('1,1,2,3,4,4,5,6,6,7' , '[^,]+', 1, lvl) 
FROM DUAL, 
(SELECT LEVEL lvl 
FROM DUAL 
CONNECT BY LEVEL <= LENGTH('1,1,2,3,4,4,5,6,6,7') - LENGTH(REPLACE('1,1,2,3,4,4,5,6,6,7' , ','))+1) 
WHERE lvl <= LENGTH('1,1,2,3,4,4,5,6,6,7') - LENGTH(REPLACE('1,1,2,3,4,4,5,6,6,7' , ',')) + 1 
+0

'ORA-00904: REGEXP_SUBSTR: недопустимый идентификатор' встречается в Oracle 9i – Sam1604

0

Try

select 
    regexp_replace('1,1,2,3,4,4,5,6,6,7', '([^,]+),\1', '\1') 
from 
    dual; 

Однако это не будет работать, если ваша строка ввода содержит цифру более чем в два раза. Если это беспокоит вас, вы можете попробовать

select 
    regexp_replace('1,1,2,3,4,4,4,5,6,6,6,6,6,6,7', '([^,]+)(,\1)+', '\1') 
from dual; 
0

По моей точки зрения:

select wm_concat(distinct substr(replace('1,1,2,3,4,4,5,6,6,7',',',''),level,1)) as out  
from dual connect by level <= length('1,1,2,3,4,4,5,6,6,7'); 
0
SELECT 
    listagg(ra,',') WITHIN GROUP (ORDER BY ra) 
FROM 
(
    SELECT 
    DISTINCT (REGEXP_SUBSTR('02,02,02,02,02,03,04,03', '[^,]+', 1, LEVEL))ra 
    FROM DUAL 
    CONNECT BY REGEXP_SUBSTR('02,02,02,02,02,03,04,03', '[^,]+', 1, LEVEL) IS 
    NOT NULL 
); 
Смежные вопросы