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,
4 Réponses :
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;
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);
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>
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
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