0

リクエストがあります。オペレーターが何も入力しない場合は、すべてのユーザーを取得します。しかし、オペレーターがいくつかのユーザー名を複数入力した場合、名前が入力されたユーザーのみを取得します。以下のようなサブクエリを使用します。

テーブルaからユーザー情報を取得するためのIN条件としてsubquery(テーブルb)を使用していますが、正常に機能しています。

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

しかし、テーブルbに何もない場合は、aからすべてのユーザーを選択する必要があります。その方法がわかりません。これを1人のユーザーに対してのみ実行する前に、typeInUserName = NULLの場合、WHERE UserName=UserNameはすべてのユーザーを取得します。

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

1 に答える 1

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に一致するレコードが2つある場合

 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.

Case3テーブル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

于 2012-07-23T20:13:56.517 に答える