我想比较emp_x表中的last_name值,如果匹配任何记录,则前三个字符的名称列,然后我想从emp_x表返回该值。
以下是我的表格和记录:
select substr(x.last_name,1,3) from employee x;
Mathews
Smith
Rice
Black
Green
Larry
Cat
select * from emp_x;
Mataaa
Mmitta
Smitta
Riceeeee
Expected Result:
select decode(substr(x.last_name,1,3), substr(x.last_name,1,3), (select name from emp_x y where y.name like substr(x.last_name,1,3)||'%'),x.last_name) from employee x;
Mataaa
Smitta
Riceeeee
NULL
NULL
NULL
NULL
我得到了确切的结果,但是在pl / sql程序中还有其他最好的方法可以使用它。
比如说,我从employee表中获取'Mathews'last_name值并读取前3位数并在emp_x表中进行比较,并在上面的解码函数中获得Mataa值。
我们可以使用任何数组或游标来比较并从pl / SQL过程中的变量中获取值,而不是从表中选择值...
请帮忙解决此问题。
答案 0 :(得分:1)
我知道这段代码不是最好的解决方案,它本质上是一种工作(ish)。无论如何我把它写成只是花了一些时间在工作上,我希望即使它不是完整的解决方案,你会对你想要达到的目标有所了解
DECLARE
CURSOR c1 IS select substr(x.last_name,1,3) from employee x;
c1_rec c1%ROWTYPE;
CURSOR c2 IS select * from emp_x;
c2_rec c2%ROWTYPE;
l_name employee.last_name%TYPE;
BEGIN
FOR c1_rec IN c1
LOOP
FOR c2_rec IN c2
LOOP
IF(c1_rec.last_name == c2_rec.name) THEN
SELECT last_name into l_name from EMPLOYEE where substr(last_name,1,3) = c1_rec.last_name;
dbms_output.put_line(l_name);
ELSE
dbms_output.put_line("NULL");
END IF;
END LOOP;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line("exception occured");
END;
答案 1 :(得分:1)
我宁愿坚持这种做法:
SQL> with employee as
2 (select 'Mathews' name from dual
3 union all
4 select 'Smith' from dual
5 union all
6 select 'Rice' from dual
7 union all
8 select 'Black' from dual
9 union all
10 select 'Green' from dual
11 union all
12 select 'Larry' from dual
13 union all
14 select 'Cat' from dual),
15 emp_x as
16 (select 'Mataaa' pattern from dual
17 union all
18 select 'Mmitta' from dual
19 union all
20 select 'Smitta' from dual
21 union all
22 select 'Riceeeee' from dual)
23 select nvl(ex.pattern, 'NULL') result
24 from employee e
25 left outer join emp_x ex
26 on substr(ex.pattern, 1, 3) = substr(e.name, 1, 3);
RESULT
--------
Mataaa
Smitta
Riceeeee
NULL
NULL
NULL
NULL
7 rows selected
您没有提供有关表的大小的任何信息,但无论如何,此查询中的散列连接将比任何过程代码快得多。当然,如果您需要在某些过程中使用它,您可以将其包装在游标中:
for c1 in (select ...)
loop
dbms_output.put_line(c1.result);
end loop;
答案 2 :(得分:0)
这可以用于使用游标比较集合:
声明
光标c1是
从empc中选择last_name ls;
type x是employees.last_name%type;
的表x1 x:= x();
cnt integer:= 0;
开始
用于c1循环中的z
cnt:= cnt +1;
x1.extend;
x1(cnt):= z.ls;
如果x1(cnt)为NULL,那么
DBMS_OUTPUT.PUT_LINE( 'ASHISH');
结束if;
dbms_output.put_line(cnt ||''|| x1(cnt));
结束循环;
端;