3
votes

Existe-t-il un moyen alternatif ou meilleur pour concaténer deux chaînes

J'ai deux chaînes, dites "bonjour" et "monde", je dois les concaténer comme, premier caractère de la première chaîne + premier caractère de la deuxième chaîne et ainsi de suite ... par exemple. "hweolrllod"

J'ai essayé avec ça ...

Declare 
 string1 varchar2(10) := 'hello';
 string2 varchar2(10) := 'world'; 
 Type arr is varray(10) of varchar2(30);
 concat arr;
Begin
 concat := arr();
 concat.extend;
 for i in 1..5 loop
   concat(i) := substr(string1,i,1); 
   concat.extend;
   concat(i+1) := substr(string2,i,1);
   dbms_output.put_line(concat(i) || concat(i+1));
 end loop;
End;

Y a-t-il une autre ou meilleure façon d'y parvenir?

Merci,


0 commentaires

4 Réponses :


3
votes

Je ne comprends pas votre objectif mais je pense que c'est la même chose que le sucre de syntaxe et de toute façon pour moi c'est une manière alternative

Declare 
 string1 varchar2(10) := 'hello';
 string2 varchar2(10) := 'world'; 
 Type arr is varray(10) of varchar2(30);
 concat arr;
 string3 varchar2(50);
Begin
 concat := arr();
 concat.extend;
 for i in 1..5 loop
/*   concat(i) := substr(string1,i,1); 
   concat.extend;
   concat(i+1) := substr(string2,i,1);
   dbms_output.put_line(concat(i) || concat(i+1));*/

   string3 := string3 ||substr(string1,i,1) || substr(string2,i,1);
   dbms_output.put_line(string3);
 end loop;

End;


1 commentaires

merci pour votre réponse, je pense que cela devrait être parfait ... J'ai manqué de faire avec la manière suivante ... à la place en utilisant array .. string3: = string3 || substr (string1, i, 1) || substr (chaîne2, i, 1);



2
votes

Si les chaînes ont la même longueur, alors

SQL> with test as
  2    (select 'hello' s1, 'world' s2 from dual)
  3  select listagg(substr(s1, level, 1) || substr(s2, level, 1), '')
  4    within group (order by level) result
  5  from test
  6  connect by level <= length(s1);

RESULT
-----------------------------------------------------------------------------
hweolrllod

SQL>

Ou, SQL pur (c'est-à-dire pas de PL / SQL):

SQL> set serveroutput on
SQL> Declare
  2   string1 varchar2(10) := 'hello';
  3   string2 varchar2(10) := 'world';
  4   result  varchar2(20);
  5  begin
  6    for i in 1 .. length(string1) loop
  7       result := result || substr(string1, i, 1) || substr(string2, i, 1);
  8    end loop;
  9    dbms_output.put_line(result);
 10  end;
 11  /
hweolrllod

PL/SQL procedure successfully completed.

SQL>


0 commentaires

1
votes

Vous pouvez également utiliser une requête SELECT

with t(s1,s2) AS
(
select 'hello','world' from dual
)
select listagg(substr(s1,level,1)||substr(s2,level,1),'') 
   within group ( order by level) as col
FROM t connect by 
level <= length(s1);

Si les chaînes sont de longueur différente, vous pouvez faire level

Démo


0 commentaires

0
votes

Oui, si vous êtes autorisé à utiliser directement SQL, alors utiliser SQL serait une meilleure option.

Par exemple:

J'utilise sys.odciVarchar2List pour contenir le premier tableau et je suis une sous-chaîne chaque caractère de ce tableau en utilisant une clause connect by. Aussi j'assigne rnk pour le premier tableau comme 1,3,5,7,9 etc.

Pour le deuxième tableau, je fais une logique similaire et stocke la valeur rnk comme 2,4,6,8 etc.

Enfin, j'unionne tous les deux tableaux et j'exécute une requête d'agrégation sur le char_val ordonné par valeur rnk

donc nous aurions des valeurs comme

rnk = 1 heure rnk = 2 w rnk = 3 hweolrllod

with first_array
  as (select  2*rownum-1 as rnk
             ,substr(column_value,rownum,1) as char_val
             ,column_value as col_val              
        from TABLE(sys.odciVarchar2List('hello'))
      connect by level<=length(column_value)
      )    
    ,second_array
    as (select  2*rownum as rnk
             ,substr(column_value,rownum,1) as char_val
             ,column_value as col_val              
        from TABLE(sys.odciVarchar2List('world'))
      connect by level<=length(column_value)
        )
select listagg(x.char_val,'') within group(order by x.rnk)
from (
 select rnk,char_val
   from first_array
 union all
 select rnk,char_val
   from second_array
     )x


0 commentaires