Kanodia, Gaurav Punani, Rohit Singhal, Bhavya
3 Réponses :
Si la chaîne d'entrée si le format de la chaîne d'entrée diffère, alors ce qui précède (évidemment) ne fonctionnera pas correctement. p> Voici une option comment vous pourriez le faire. Je ne suis pas très bon dans des expressions régulières complexes, donc j'ai écrit une fonction qui remplacera même des occurrences de la virgule avec un
# code>) li>
# code> (au lieu de , code>) li>
niveau code> sera toujours li>
ul>
# code> et utiliser cette fonction ultérieure. P> SQL> with test (col) as
2 (select 'Kanodia, Gaurav,Punani, Rohit,Singhal, Bhavya' from dual union all
3 select 'Little, Foot, MT0, DbFiddle' from dual union all
4 select 'January, February, March, April, May, June, July, August' from dual)
5 select
6 col,
7 trim(regexp_substr(f_rep(col), '[^#]+', 1, column_value)) repcol_split
8 from test,
9 table(cast(multiset(select level from dual
10 connect by level <= regexp_count(f_rep(col), '#') + 1
11 ) as sys.odcinumberlist));
COL REPCOL_SPLIT
-------------------------------------------------------- --------------------
Kanodia, Gaurav,Punani, Rohit,Singhal, Bhavya Kanodia, Gaurav
Kanodia, Gaurav,Punani, Rohit,Singhal, Bhavya Punani, Rohit
Kanodia, Gaurav,Punani, Rohit,Singhal, Bhavya Singhal, Bhavya
Little, Foot, MT0, DbFiddle Little, Foot
Little, Foot, MT0, DbFiddle MT0, DbFiddle
January, February, March, April, May, June, July, August January, February
January, February, March, April, May, June, July, August March, April
January, February, March, April, May, June, July, August May, June
January, February, March, April, May, June, July, August July, August
9 rows selected.
SQL>
Que devrais-je faire pour vérifier la présence même, c'est-à-dire Supposons qu'il y ait trois noms de noms, prénom, nom, prénom, nom, prénom, nom, prénom
Vous remplaceriez le 2e, 4ème, 6ème, ... survenue d'une virgule avec # et modifier la valeur de niveau au nombre de virgules divisé par 2.
Oui mais comment faire ça? J'ai essayé mais ça ne donne pas le résultat
DB <> FIDDLE Cela ne fonctionne pas pendant plus de 2 paires et génère plus de deux paires et génère plus Dupliquer des lignes si l'entrée a plusieurs rangées.
Gaurav, j'ai édité mon message, j'ai un coup d'oeil. @ MT0: Oui, c'est ce que j'ai dit. Une nouvelle requête corrige cela.
Vous pouvez utiliser regexp_substr (col, '(. *?,. *?) (, | $)', 1, colonne_value, null, 1) code> DB <.Fiddle a>
-- for one row
with s as
(select 'Kanodia, Gaurav,Punani, Rohit' str from dual)
select regexp_substr(str, '[^,]+,[^,]+', 1, level) str
from s
connect by level <= ceil(regexp_count(str, ',') / 2);
STR
------------------------------
Kanodia, Gaurav
Punani, Rohit
Elapsed: 00:00:00.00
-- for multiple rows
with s as
(select 1 id, 'Kanodia, Gaurav,Punani, Rohit' str from dual union all
select 2 id, '1, 2, 3, 4' str from dual union all
select 3 id, '6, 7, 8, 9' str from dual
)
select id, level num, regexp_substr(str, '[^,]+,[^,]+', 1, level) str
from s
connect by id = prior id and level <= ceil(regexp_count(str, ',') / 2)
and prior dbms_random.value is not null;
ID NUM STR
---------- ---------- ------------------------------
1 1 Kanodia, Gaurav
1 2 Punani, Rohit
2 1 1, 2
2 2 3, 4
3 1 6, 7
3 2 8, 9
Ceci n'utilise pas d'expressions régulières (uniquement des fonctions de chaîne simples) et fonctionnera pour plusieurs lignes d'entrée:
ID | PAIR
-: | :--------------
1 | Kanodia, Gaurav
2 | Alice, Apple
1 | Punani, Rohit
2 | Barry, Banana
1 | Singhal, Bhavya
2 | Claire, Cherry