2015-05-29 7 views
1

Пусть у меня есть строкаИзвлечение слова из разделенных запятыми в оракула

Str = 'Aaa,Bbb,Abb,Ccc' 

Я хочу, чтобы отделить выше ул двух частей следующим образом

Str1 = 'Aaa,Abb' 

Str2 = 'Bbb,Ccc' 

То есть любое слово ул начиная с A должен идти в str1, все остальное в str2.

Как я могу достичь этого с помощью запросов Oracle?

+3

Никогда когда-либо хранить данные в виде разделенных запятыми элементов. Это вызовет у вас массу проблем. SQL не предназначен для этого, вместо этого имеют отдельные строки. – jarlh

+0

Добавление к комментарию @ jarlh - вы можете использовать вложенные таблицы или другие типы коллекций. – Rachcha

ответ

3

Это любое слово в str, начинающемся с A, должно идти в str1, все остальное в str2.

Для достижения этого в чистом SQL, я буду использовать следующее:

  • REGEXP_SUBSTR
  • LISTAGG
  • SUBSTR
  • INLINE VIEW

Итак, сначала я разделил строку с разделителями-запятыми, используя методы, как показано здесь Split single comma delimited string into rows.

И затем, я их заполнить, используя LISTAGG в заказе.

Например,

SQL> WITH 
    2 t1 AS (
    3 SELECT 'Aaa,Bbb,Abb,Ccc' str FROM dual 
    4  ), 
    5 t2 AS (
    6 SELECT trim(regexp_substr(str, '[^,]+', 1, LEVEL)) str 
    7 FROM t1 
    8 CONNECT BY LEVEL <= regexp_count(str, ',')+1 
    9 ORDER BY str 
10  ) 
11 SELECT 
12 (SELECT listagg(str, ',') WITHIN GROUP(
13 ORDER BY NULL) str1 
14 FROM t2 
15 WHERE SUBSTR(str, 1, 1)='A' 
16 ) str1, 
17 (SELECT listagg(str, ',') WITHIN GROUP(
18 ORDER BY NULL) str 
19 FROM t2 
20 WHERE SUBSTR(str, 1, 1)<>'A' 
21 ) str2 
22 FROM dual 
23/

STR1  STR2 
---------- ---------- 
Aaa,Abb Bbb,Ccc 

SQL> 

С пункт только для демонстрационных целей, в реальной ситуации, удалите с п и использовать вас имя таблицы непосредственно. Хотя он выглядит аккуратно, используя предложение WITH.

0

Используйте выражение regext и функцию ListAg.

ПРИМЕЧАНИЕ: Функция LISTAGG доступна с Oracle 11g!

select listagg(s.name, ',') within group (order by name) 
    from (select regexp_substr('Aaa,Bbb,Abb,Ccc,Add,Ddd','[^,]+', 1, level) name from dual 
     connect by regexp_substr('Aaa,Bbb,Abb,Ccc,Add,Ddd', '[^,]+', 1, level) is not null) s 
group by decode(substr(name,1,1),'A', 1, 0); 
+0

OP хочет в двух разных столбцах. –

0

Этот запрос дает желаемый результат в двух разных строках:

with temp as (select trim (both ',' from 'Aaa,Bbb,Abb,Ccc') as str from dual), 
    base_table as 
     ( select trim (regexp_substr (t.str, 
              '[^' || ',' || ']+', 
              1, 
              level)) 
         str 
       from temp t 
      connect by instr (str, 
          ',', 
          1, 
          level - 1) > 0), 
    ult_table as 
     (select str, 
       case upper (substr (str, 1, 1)) when 'A' then 1 else 2 end 
        as l 
      from base_table) 
select listagg (case when l = 1 then str else null end, ',') 
      within group (order by str) 
      str1, 
     listagg (case when l = 2 then str else null end, ',') 
      within group (order by str) 
      str2 
    from ult_table; 

Выходной

  L STR 
---------- -------------------------------------------------------------------------------- 
     1 Aaa,Abb                   
     2 Bbb,Ccc  
+0

OP хочет в двух разных столбцах. –

+0

@ LalitKumarB- спасибо, что заметили это. Отредактировал код. – Rachcha

Смежные вопросы