我是新来的,求解一个字符串处理的问题

weivivia 2004-04-30 12:59:42
写一个函数f_include(p_a varchar2,p_b varchar2) return number;
传入参数 p_a, p_b 均是由逗号分隔的字符串,要求判断p_b中逗号分隔的各个字符串是否均在p_a用
逗号分隔的字符串中,如果都是则返回1否则返回0
如:
select f_include('a,bc,81','b,c'),f_include('a,bc,81','bc,a') from dual;
F_INCLUDE('A,BC,81','B,C') F_INCLUDE('A,BC,81','BC,A')
-------------------------- ---------------------------
0 1
其中第一个返回 0, 第二个返回 1


我的代码如下:
create or replace function f_include(p_a varchar2,p_b varchar2) return number
is
result number:=1;
p_a_r varchar2(100) :='';
p_b_r varchar2(100) :='';
a varchar2(100):=p_a;
b varchar2(100):=p_b;
begin
if p_a_r!=p_b_r then
for i in 1..length(a) loop
p_a_r:=p_a_r||substr(a,i,instr(a,',')-1);
a:=substr(a,instr(a,',')+1);
for j in 1..length(b) loop
p_b_r:=p_b_r||substr(b,j,instr(b,',')-1);
b:=substr(b,instr(b,',')+1);
end loop;
result :=0;
end loop;
end if;
return result;
end;
错在哪里呢?请指教,谢谢!


...全文
86 9 点赞 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
navis 2004-09-21
收藏
  • 打赏
  • 举报
回复
weivivia 2004-05-08
问题解决了,谢谢大家!
我还是在原有的基础上改了一下:
create or replace function f_include(p_a varchar2,p_b varchar2) return number
is
result number:=1;
p_a_r varchar2(100) :='';
p_b_r varchar2(100) :='';
a varchar2(100) := p_a || ',';
b varchar2(100) := p_b || ',';
begin
for i in 1..length(b) loop
p_b_r := p_b_r || substr(b,i,1);
if substr(b,i,1) = ',' then
for j in 1..length(a) loop
p_a_r := p_a_r || substr(a,j,1);
if substr(a,j,1) = ',' then
if p_b_r = p_a_r then
p_a_r := '';
p_b_r := '';
goto out_loop;
elsif j = length(a) then
return 0;
end if;
p_a_r := '';
end if;
end loop;
<<out_loop>>
null;
end if;
end loop;
return 1;
end;
  • 打赏
  • 举报
回复
snowy_howe 2004-05-05
CREATE OR REPLACE FUNCTION f_include (p_a VARCHAR2, p_b VARCHAR2)
RETURN NUMBER
IS
TYPE tab IS VARRAY (100) OF VARCHAR2 (10);

t_a tab := tab (1,2,3,4,5,6,7,8,9,10);
t_b tab := tab (1,2,3,4,5,6,7,8,9,10);
a VARCHAR2 (100) := p_a;
b VARCHAR2 (100) := p_b;
i INTEGER := 1; --逗号的位置
m INTEGER := 1; --a中逗号的数量,控制数组的下标。
n INTEGER := 1; --b中逗号的数量,控制数组的下标。
RESULT NUMBER := 1;
BEGIN
LOOP
i := INSTR (a, ',');

IF i <> 0
THEN
t_a (m) := SUBSTR (a, 1, i - 1);
a := SUBSTR (a, i + 1);
ELSE
t_a (m) := a;
EXIT;
END IF;

m := m + 1;
END LOOP;

LOOP
i := INSTR (b, ',');

IF i <> 0
THEN
t_b (n) := SUBSTR (b, 1, i - 1);
b := SUBSTR (b, i + 1);
ELSE
t_b (n) := b;
EXIT;
END IF;

n := n + 1;
END LOOP;

FOR i IN 1 .. n
LOOP
FOR j IN 1 .. m
LOOP
IF t_a (j) <> t_b (i)
THEN
RESULT := 0;
ELSE
RESULT := 1;
EXIT;
END IF;
END LOOP;

IF RESULT = 0
THEN
RETURN RESULT;
END IF;
END LOOP;

RETURN RESULT;
END;

你试试这个。
  • 打赏
  • 举报
回复
snowy_howe 2004-05-05
SQL> select 1 from dual where 'a' != '';

未选定行

所以用p_a_r != ''会被认为是false,无论p_a_r是否为空。
这里最好用p_a_r is not null来判断,涉及到的几个都要改。

不过你的逻辑还是有问题,简单推理就可以知道。
两个得出来的结果均为0;
  • 打赏
  • 举报
回复
weivivia 2004-04-30
现在我的代码改为:create or replace function f_include(p_a varchar2,p_b varchar2) return number
is
result number:=1;
p_a_r varchar2(100) :='';
p_b_r varchar2(100) :='';
a varchar2(100):=p_a;
b varchar2(100):=p_b;
begin
<<lab1>>
p_b_r:=substr(b,1,instr(b,',')-1);
b:=substr(b,instr(b,',')+1);
<<lab2>>
p_a_r:=substr(a,1,instr(a,',')-1);
a:=substr(a,instr(a,',')+1);
if p_a_r!='' and p_b_r!='' and p_a_r=p_b_r then
goto lab1;
elsif p_a_r!='' and p_b_r!=''and p_a_r!=p_b_r then
result:=0;
goto lab2;
end if;
return result;
end;
/
select f_include('a,bc,81','b,c'),f_include('a,bc,81','bc,a') from dual;
/


但执行结果是:
SQL>

Function created

F_INCLUDE('A,BC,81','B,C') F_INCLUDE('A,BC,81','BC,A')
-------------------------- ---------------------------
1 1
为什么阿?!
elsif p_a_r!='' and p_b_r!=''and p_a_r!=p_b_r then
result:=0;
没有执行到嘛?
  • 打赏
  • 举报
回复
weivivia 2004-04-30
我觉得这样的区别也不是很大吧
  • 打赏
  • 举报
回复
atao245993 2004-04-30
打错了。是首尾,不是首位
  • 打赏
  • 举报
回复
atao245993 2004-04-30
我认为简单的办法应该是在a串的首位都加个逗号,成为',adfa,dgdfg,ertry,xcbbcv,'
然后截取b串中的小段p_b_r,让p_b_r段首位也加上逗号,
判断该加逗号的p_b_r段是否在加个逗号的a段中。如果在返回1,如果不在返回0。
好象比你那样要简单省的那么LOOP那么多
  • 打赏
  • 举报
回复
welyngj 2004-04-30
逻辑错误。
  • 打赏
  • 举报
回复
相关推荐
发帖
Oracle
加入

1.6w+

社区成员

Oracle开发相关技术讨论
申请成为版主
帖子事件
创建了帖子
2004-04-30 12:59
社区公告
暂无公告