トップページに戻る    次の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か判定してます