SQL> desc p_co
Name Type Nullable Default Comments
--------- ------------ -------- ------- --------
CO VARCHAR2(5) Y
TCOMK VARCHAR2(1) Y
COABR VARCHAR2(20) Y
COADDRESS VARCHAR2(50) Y 测试数据:
create table p_co(co varchar2(5),tcomk varchar2(1),coabr varchar2(20),coaddress varchar2(50));
insert into p_co values('X','1','腾讯(讨论部)','B省B区B街道');
insert into p_co values('X','A','腾讯(测试部)','A省A区A街道');
insert into p_co values('X','B','腾讯(研发部)','A省A区A街道');
insert into p_co values('X','','腾讯(市场部)','A省A区A街道');
insert into p_co values('X','','腾讯(销售部)','B省B区B街道');
insert into p_co values('Y','','IBM(测试部)','A省A区A街道');
insert into p_co values('Z','B','SAP(研发部)','A省A区A街道');
insert into p_co values('Z','','SAP(市场部)','A省A区A街道');
insert into p_co values('M','','ORACLE(销售部)','A省A区A街道');
insert into p_co values('M','A','ORACLE(研发部)','B省B区B街道');
insert into p_co values('N','B','N公司','B省B区B街道');SQL> select * from p_co order by co,tcomk;CO TCOMK COABR COADDRESS
----- ----- -------------------- --------------------------------------------------
M A ORACLE(研发部) B省B区B街道
M ORACLE(销售部) A省A区A街道
N B N公司 B省B区B街道
X 1 腾讯(讨论部) B省B区B街道
X A 腾讯(测试部) A省A区A街道
X B 腾讯(研发部) A省A区A街道
X 腾讯(市场部) A省A区A街道
X 腾讯(销售部) B省B区B街道
Y IBM(测试部) A省A区A街道
Z B SAP(研发部) A省A区A街道
Z SAP(市场部) A省A区A街道11 rows selectedSQL> 现在的需求:
输入参数公司CO,获取公司名称COABR.
筛选条件为:若存在输入的CO有多笔,则查询再追加一个条件——TCOMK='A';
若输入的CO只有一笔资料,则直接取公司名称COABR。上述测试数据最终符合条件的结果:
CO TCOMK COABR COADDRESS
----- ----- -------------------- --------------------------------------------------
M A ORACLE(研发部) B省B区B街道
N B N公司 B省B区B街道
X A 腾讯(测试部) A省A区A街道
Y IBM(测试部) A省A区A街道
Name Type Nullable Default Comments
--------- ------------ -------- ------- --------
CO VARCHAR2(5) Y
TCOMK VARCHAR2(1) Y
COABR VARCHAR2(20) Y
COADDRESS VARCHAR2(50) Y 测试数据:
create table p_co(co varchar2(5),tcomk varchar2(1),coabr varchar2(20),coaddress varchar2(50));
insert into p_co values('X','1','腾讯(讨论部)','B省B区B街道');
insert into p_co values('X','A','腾讯(测试部)','A省A区A街道');
insert into p_co values('X','B','腾讯(研发部)','A省A区A街道');
insert into p_co values('X','','腾讯(市场部)','A省A区A街道');
insert into p_co values('X','','腾讯(销售部)','B省B区B街道');
insert into p_co values('Y','','IBM(测试部)','A省A区A街道');
insert into p_co values('Z','B','SAP(研发部)','A省A区A街道');
insert into p_co values('Z','','SAP(市场部)','A省A区A街道');
insert into p_co values('M','','ORACLE(销售部)','A省A区A街道');
insert into p_co values('M','A','ORACLE(研发部)','B省B区B街道');
insert into p_co values('N','B','N公司','B省B区B街道');SQL> select * from p_co order by co,tcomk;CO TCOMK COABR COADDRESS
----- ----- -------------------- --------------------------------------------------
M A ORACLE(研发部) B省B区B街道
M ORACLE(销售部) A省A区A街道
N B N公司 B省B区B街道
X 1 腾讯(讨论部) B省B区B街道
X A 腾讯(测试部) A省A区A街道
X B 腾讯(研发部) A省A区A街道
X 腾讯(市场部) A省A区A街道
X 腾讯(销售部) B省B区B街道
Y IBM(测试部) A省A区A街道
Z B SAP(研发部) A省A区A街道
Z SAP(市场部) A省A区A街道11 rows selectedSQL> 现在的需求:
输入参数公司CO,获取公司名称COABR.
筛选条件为:若存在输入的CO有多笔,则查询再追加一个条件——TCOMK='A';
若输入的CO只有一笔资料,则直接取公司名称COABR。上述测试数据最终符合条件的结果:
CO TCOMK COABR COADDRESS
----- ----- -------------------- --------------------------------------------------
M A ORACLE(研发部) B省B区B街道
N B N公司 B省B区B街道
X A 腾讯(测试部) A省A区A街道
Y IBM(测试部) A省A区A街道
CREATE OR REPLACE PROCEDURE p_co_test(i_co IN VARCHAR2(10), o OUT SYS_REFCURSOR) IS
sql_str VARCHAR2(4000);
cn PLS_INTEGER;
BEGIN
SELECT COUNT(*) INTO cn FROM p_co;
IF cn = 1 THEN
sql_str := 'select CO,TCOMK,COABR,COADDRESS from p_co where co=''' || i_co || '''';
ELSE
sql_str := 'select CO,TCOMK,COABR,COADDRESS from p_co where TCOMK=''A'' and co=''' || i_co || '''';
END IF;
OPEN o FOR sql_str;
END p_co_test;
from (
select t.*,
case when t.tcomk = 'A' then 1
else 0
end tcomk_is_a,
count(1) over(partition by co) co_cnt
from p_co t
)
where co_cnt = 1
or tcomk_is_a = 1