我有两个字符串,例如“ 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')
是否有替代或更好的方法来实现这一目标?
谢谢
答案 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))
答案 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