2012-07-23 85 views
0

我有一個請求,如果操作符輸入什麼都沒有,我將檢索所有用戶。但如果運算符多輸入一些用戶名,我只retirve誰的用戶姓名輸入,我打算使用子查詢如下需要pl/sql存儲過程幫助

我使用子查詢(表b)作爲IN條件從表a中獲取用戶的信息,它運作良好。

SELECT * FROM a WHERE UserName IN (SELECT UserName FROM b)

但是,如果表B有什麼,我需要選擇從所有用戶,我不知道該怎麼做。 在我只能爲一個用戶執行此操作之前,如果typeInUserName = NULL,那麼WHERE UserName = UserName將爲所有用戶重新啓動我。

SELECT * FROM a WHERE UserName = NVL(typeInUserName,UserName) 

回答

0
create table a (username varchar2(20)); 

insert into a values('gaurav'); 
insert into a values('rahul'); 
insert into a values('rohan'); 
insert into a values('niharika'); 

create table b (username varchar2(20)); 

insert into b values('gaurav'); 
insert into b values('rahul'); 

殼體1:當沒有在表B中的記錄

Delete from b; 

WITH cnt_b as 
(
select count(*) cnt from b 
) 
select a.username from a ,cnt_b where 1= CASE WHEN cnt_b.cnt=0 THEN 1 ELSE 0 END 
UNION 
select a.username from a,cnt_b,b where a.username =b.username and cnt_b.cnt>0; 

USERNAME    

gaurav    
niharika    
rahul    
rohan    

4 rows selected. 

情況2當有表B中

兩個匹配的記錄
insert into b values('gaurav'); 
insert into b values('rahul'); 

WITH cnt_b as 
(
select count(*) cnt from b 
) 
select a.username from a ,cnt_b where 1= CASE WHEN cnt_b.cnt=0 THEN 1 ELSE 0 END 
UNION 
select a.username from a,cnt_b,b where a.username =b.username and cnt_b.cnt>0; 


USERNAME    
-------------------- 
gaurav    
rahul    

2 rows selected. 

案例3當表B中有記錄但沒有匹配記錄時。

delete from b 

insert into b values('rajat'); 
insert into b values('garima'); 

with cnt_b as 
(
select count(*) cnt from b 
) 
select a.username from a ,cnt_b where 1= CASE WHEN cnt_b.cnt=0 THEN 1 ELSE 0 END 
UNION 
select a.username from a,cnt_b,b where a.username =b.username and cnt_b.cnt>0 

no rows selected. 

乾杯GS

+0

它的工作原理,謝謝你這麼多的UNION。 – 2012-07-23 20:42:32