プロが教える店舗&オフィスのセキュリティ対策術

ORACLE環境下、SQLにて以下のような条件でデータを取得したいです。

AテーブルとBテーブルを結合して、Bテーブルから名称を取得する。
<Aテーブル>
id (key) 番号1 番号2
A01  001  n0001
A02  null  n0002

<Bテーブル>
code(key) 名前  番号1 番号2
c0001   太郎  001  n0001
c0002   次郎  002  n0002

(1)A.番号が入力されていれば
A.番号1=B.番号1 AND A.番号2=B.番号2を条件にする

(2)A.番号が入力されていなければ
A.番号=B.番号を条件からはずす。
A.番号2=B.番号2 のみで検索する。

<欲しい結果>
A01→太郎を取得
A02→次郎を取得

入力されていたら条件に加え、入力されていなかったら
条件から外す、というSQLを教えていただけないでしょうか。
よろしくお願いいたします。

A 回答 (6件)

orで2つの条件を書く。



select a.id, b.名前
from Aテーブル a
inner join Bテーブル b on (
(b.番号1 = a.番号1 and b.番号2 = a.番号2)
or
(a.番号1 is null and b.番号2 = a.番号2)
);

もしくは、Aテーブルの番号1がnullのときはBテーブルの番号1で結合する(=全件ヒット)。

select a.id, b.名前
from Aテーブル a
inner join Bテーブル b on (
b.番号1 = nvl(a.番号1,b.番号1) and b.番号2 = a.番号2
);

でどうでしょうか。
    • good
    • 0

orで二つの条件を書く。



select a.id, b.名前
from Aテーブル a
inner join Bテーブル b on (
(b.番号1 = a.番号1 and b.番号2 = a.番号2)
or
(a.番号1 is null and b.番号2 = a.番号2)
);

もしくは、Aテーブルの番号1がnullのときはBテーブルの番号1で結合する。
ただし、こちらの方法ではBテーブルの番号1にnullが入る場合はうまくいきません。

select a.id, b.名前
from Aテーブル a
inner join Bテーブル b
on (
b.番号1 = nvl(a.番号1,b.番号1) and b.番号2 = b.番号2
);

でどうでしょうか。

この回答への補足

回答いただきありがとうございます。

nullの場合は条件から完全に外したいのです。
※番号1 is null の場合、nullで検索しない。

もし代案ありましたらよろしくお願いします。

補足日時:2011/08/23 12:26
    • good
    • 0

No.1、No.2です。



何回かリロードしても回答が反映されていなかったので、再度回答したところ重複してしまいました。
すみません・・・
    • good
    • 1

>nullの場合は条件から完全に外したいのです。


の意図がよく分かりません・・・
さきほどのSQLで希望の結果になると思うのですが。
SQLから消したいのであれば、プログラムで動的にSQLを組み立てればいいのではないでしょうか。
    • good
    • 0

(1)と(2)をunionしてはどうでしょう?



select a.id, b.名前 from Aテーブル where a.番号1 is not null and a.番号1 = b.番号1
union
select a.id, b.名前 from Aテーブル where a.番号1 is null and a.番号2 = b.番号2
;
    • good
    • 0

#5です。

Bテーブルとエイリアスが不足してました。

(1)と(2)をunionしてはどうでしょう?

select a.id, b.名前 from Aテーブル a, Bテーブル b where a.番号1 is not null and a.番号1 = b.番号1
union
select a.id, b.名前 from Aテーブル a, Bテーブル b where a.番号1 is null and a.番号2 = b.番号2
;
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す