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街道

解决方案 »

  1.   

    --写一个
    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;
      

  2.   

    大概可以这样写select *
      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