是否有替代或更好的方法来连接两个字符串

时间:2019-02-12 09:01:10

标签: sql oracle plsql

我有两个字符串,例如“ hello”和“ world”,我需要将它们串联在一起,第一个字符串中的第一个字符+第二个字符串中的第一个字符,依此类推... 例如“ hweolrllod”

我尝试过这个...

WHERE 
  (x = 'value1' OR y = 'value2' OR z = 'value3') OR 
  (NOT (x = 'value1' OR y = 'value2' OR z = 'value3') and a = 'value4')

是否有替代或更好的方法来实现这一目标?

谢谢

4 个答案:

答案 0 :(得分:2)

我不了解您的目标,但我认为它与语法糖相同,无论如何对我来说都是替代方式

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 :(得分:2)

如果字符串长度相同,则

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>

答案 2 :(得分:1)

您也可以使用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))

Demo

答案 3 :(得分:0)

是的,如果允许使用直接sql,则使用SQL会是一个更好的选择。

例如:

我正在使用sys.odciVarchar2List来保存第一个数组,并且我使用connect by子句对该字符串中的每个字符进行子字符串化。我也正在将第一个数组的rnk辅助为1,3,5,7,9等。

对于第二个数组,我正在执行类似的逻辑,并将rnk值存储为2、4、6、8等。

最后,我将所有两个数组合并,并对rnk值排序的char_val执行聚合查询

所以我们的值为

rnk = 1小时 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