0
votes

Comment diviser un nom séparé par une virgule (même survenance) à Oracle?

Kanodia, Gaurav
Punani, Rohit
Singhal, Bhavya

0 commentaires

3 Réponses :


3
votes

Si la chaîne d'entrée Toujours forte> ressemble à celle que vous avez montrée, alors

  • Remplacez la deuxième virgule avec quelque chose d'autre (E.G. # code>) li>
  • Split la chaîne d'entrée sur # code> (au lieu de , code>) li>
  • niveau code> sera toujours li> ul>
    xxx pré>

    si le format de la chaîne d'entrée diffère, alors ce qui précède (évidemment) ne fonctionnera pas correctement. p>


    [ Modifier strong>] 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> 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>
    


6 commentaires

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) DB <.Fiddle



0
votes
-- 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

0 commentaires

0
votes

Ceci n'utilise pas d'expressions régulières (uniquement des fonctions de chaîne simples) et fonctionnera pour plusieurs lignes d'entrée:

Oracle Configuration forte>: P>

ID | PAIR           
-: | :--------------
 1 | Kanodia, Gaurav
 2 | Alice, Apple   
 1 | Punani, Rohit  
 2 | Barry, Banana  
 1 | Singhal, Bhavya
 2 | Claire, Cherry 


0 commentaires