Есть ли альтернативный или лучший способ объединить две строки - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть две строки, скажем "привет" и "мир", мне нужно объединить их как: первый символ из первой строки + первый символ из второй строки и так далее ... например, "hweolrllod"

Я пытался с этим ...

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;

Есть ли альтернативный или лучший способ добиться этого?

Спасибо,

Ответы [ 4 ]

0 голосов
/ 12 февраля 2019

Да, если вам разрешено использовать прямой sql, тогда лучше использовать SQL.

Например:

Я использую sys.odciVarchar2List для хранения первого массива, и яя подстроку каждого символа в этом массиве, используя предложение подключения по.ТАКЖЕ я назначаю rnk для первого массива как 1,3,5,7,9 и т. Д.

Для второго массива я делаю аналогичную логику и сохраняю значение rnk как 2,4,6,8 и т. Д...

Наконец, я объединяю все два массива и выполняю запрос агрегации на char_val, упорядоченный по значению rnk

, поэтому мы будем иметь значения как

rnk = 1 h rnk= 2 недели = 3 часа

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 голосов
/ 12 февраля 2019

Если строки имеют одинаковую длину, то

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>

Или чистый SQL (т.е. без PL / SQL):

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>
0 голосов
/ 12 февраля 2019

Вы также можете использовать 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);

Если строки имеют разную длину, вы можете сделать level <= greatest(length(s1),length(s2))

Демо

0 голосов
/ 12 февраля 2019

Я не понимаю вашу цель, но я думаю, что это то же самое, что и синтаксис сахар, и в любом случае для меня это альтернативный способ

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...