トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
9-16 プリンタの割り当て
SQLパズル
Printerテーブル
UserID PrinterName description
------ ----------- --------------
aaaaaa LPT1 aaa's Printer
bbbbbb LPT2 bbb's Printer
cccccc LPT3 ccc's Printer
null LPT4 common Printer
null LPT5 common Printer
UserIDを引数として、
Printerテーブルに
UserIDが一致するレコードがあれば、そのレコードを出力
UserIDが一致するレコードがなければ、UserIDがnullのレコードの、どれか1レコードを出力する
SQLパズル(日本語版)のパズル7 [プリンタのスケジュール] を参考にさせていただきました
SQLパズル 第2版のパズル8 [プリンタの割り当て] を参考にさせていただきました
データ作成スクリプト
create table Printer(
UserID varchar2(6),
PrinterName varchar2(4),
description varchar2(14));
insert into Printer values('aaaaaa','LPT1','aaa''s Printer');
insert into Printer values('bbbbbb','LPT2','bbb''s Printer');
insert into Printer values('cccccc','LPT3','ccc''s Printer');
insert into Printer values( null,'LPT4','common Printer');
insert into Printer values( null,'LPT5','common Printer');
commit;
SQL
--■■■orを使う方法■■■
def InUserID = 'aaaaaa'
select UserID,PrinterName,description
from (select UserID,PrinterName,description
from Printer
where UserID = '&InUserID' or UserID is null
order by UserID,dbms_random.random())
where RowNum=1;
def InUserID = 'XXXXXX'
/
--■■■case式を使う方法■■■
def InUserID = 'aaaaaa'
select UserID,PrinterName,description
from (select UserID,PrinterName,description
from Printer
where case when UserID != '&InUserID' then 1 else 0 end = 0
order by UserID,dbms_random.random())
where RowNum=1;
def InUserID = 'XXXXXX'
/
--■■■LNNVLを使う方法(10g以降)■■■
def InUserID = 'aaaaaa'
select UserID,PrinterName,description
from (select UserID,PrinterName,description
from Printer
where LNNVL(UserID != '&InUserID')
order by UserID,dbms_random.random())
where RowNum=1;
def InUserID = 'XXXXXX'
/
解説
UserID != &InUserID
がis not trueか判定してます