• 締切済み

場合によって条件を変えるSQL

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を教えていただけないでしょうか。 よろしくお願いいたします。

  • apoc
  • お礼率45% (40/87)
  • Oracle
  • 回答数6
  • ありがとう数0

みんなの回答

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.6

#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 ;

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.5

(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 ;

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.4

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

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.3

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

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

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 ); でどうでしょうか。

apoc
質問者

補足

回答いただきありがとうございます。 nullの場合は条件から完全に外したいのです。 ※番号1 is null の場合、nullで検索しない。 もし代案ありましたらよろしくお願いします。

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

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 ); でどうでしょうか。

関連するQ&A

  • ある条件でのSQLの取得方法について

    以下の条件でのSQLのデータの取得方法が分かりません。 2つのテーブルがあるとします。 ・テーブルA キー   項目1 10     X 20     Y ・テーブルB キー  項目2  項目3 10     5    C 10     6    D 12     6    E ここで取得する条件として ■テーブルAにあるのは、必ず取得します。 ■テーブルAのキーとテーブルBのキーは繋がり、繋がったテーブルBの情報は  別レコードとして取得します。 ■テーブルAのキー1つに対して、テーブルBのキーは無いかも知れないし、  複数件あるかも知れません。  無い場合はテーブルAの情報のみを出力し、複数件ある場合はその全てを出力します。 ■テーブルBの項目2が同じ値のデータがある場合、テーブルBを出力したレコードと  同じレコードに、項目2が同じデータの情報を出力します。  項目2が同じデータが無い場合はこの情報は出力しません。  項目2が同じ値のデータは最大2件しかありません。 上記の例の場合に出力したい結果 ・出力テーブルC キー  フラグ   項目1  項目2  項目3   項目2が同じキー  項目2が同じ値 10  テーブルA   X 10  テーブルB         5    C 10  テーブルB         6    D        12            E 20  テーブルA   Y (テーブルC のフラグとは、テーブルAの情報かテーブルBの情報かを示します) これを出来ればSQL、出来なければPL/SQLで取得したいのですが どちらの場合でも取得の方法に悩んでいます。 どのような方法で取得できるのでしょうか?

  • SQLの問題です。

    以下のような二つのテーブルがあります。 社員テーブル 社員番号 社員氏名 1     花子 2     太郎 所属テーブル 社員番号 所属番号 1     10 1     20 2     30 欲しいのは以下の結果です。 1 花子 2 太郎 以下のSQLを実行すると、 SELECT distinct a.社員番号, a.社員氏名, b.所属番号 FROM 社員 a,所属 b where a.社員番号 = b.社員番号 order by 所属番号 1 花子 1 花子 2 太郎 となってしまいます。 先に述べたとおりの結果を取得するにはどういうSQLを書いたらいいでしょうか? お知恵を貸してください。宜しくお願いします。 Oracle8iを使用しています。   

  • SQLの使用方法について(動的な結合条件の変更方法について)

    SQL Server2005を使用しています。 以下のような動作を実現したいのですが、どのようなSQLとなるのでしょうか? 以下のような構成のテーブルがあるとします。 テーブルA 分類1(PK) 分類2(PK) 名前 1     空文字   山田 1     1     山田太郎 1     2     山田花子 2     空文字   鈴木 テーブルB 番号(PK) 分類1 分類2 100  1   空文字 101  1   1 外部から受け取るパラメータはテーブルBの番号です。 次の番号を受け取った際に、以下の結果を取得したいのですが、 どのようなSQLとなるのでしょうか? 番号100 ↓ 山田 山田太郎 山田花子 番号101 ↓ 山田太郎 以下の様なSQLを作成して試してみたのですが、番号2をJOINの条件として指定しているため、 番号100の時に望む結果を得ることが出来ませんでした。 SELECT   * FROM   テーブルA AS A LEFT JOIN (   SELECT     *   FROM     テーブルB   WHERE     番号 = パラメータ ) AS B ON  A.分類1 = B.分類1 AND A.分類2 = B.分類2 サブクエリのB.分類2が空文字の場合は、JOINの条件から省くようなことは可能なのでしょうか?

  • 1回のSQL文で取得できますか

    Postgresでテーブルが2つある場合、 その2つに登録されているデータを全て取得したいのです。 例えば Aテーブル       Bテーブル Key1 key2 A     Key1 key2 B ---------- --------- 01 01 A1     01 02 A2   01 02 B2 01 03 A3   01 03 B3             01 04 B4 とある場合、 1度のSQLで下のような結果を取得できますか? Key1 key2 A   B ------------ 01 01 A1   NULL 01 02 A2   B2 01 03 A3   B3 01 04 NULL  B4 お願いいたします。

  • SQLでの抽出条件

    SQL初心者です。初歩的な質問だと思いますが、ご教授願います。 以下のような2つのテーブルがあります。 【テーブルA】 グループ 社員番号 A 1 A 2 A 3 B 4 B 5 B 6 C 7 C 8 D 9 D 1 【テーブルB】 社員番号 1 9 テーブルBの社員番号と一致する場合、テーブルAをグループ単位で抽出しないようにしたいです。  ・グループAは社員番号1が一致するため抽出しない。  ・グループDは社員番号1と9が一致するため抽出しない。 【取得結果】 グループ 社員番号 B 4 B 5 B 6 C 7 C 8 説明が分かりづらくて申し訳ありませんが、よろしくお願い致します。

  • 【至急】SQLの結合について教えてください。

    select * from A where ab = '1' and cd = '2' select ef from B where ab = '1' and cd = '2' and ef = '3' 至急質問させてください。 上記SQLを結合したいです。(Oracleです) 取得したいデータはAのテーブルの全項目で、 取得条件として、Bのテーブルの項目ef = '3' だったらという条件を加えたいです。 キー項目は両テーブルとも同じ(ab, cd)です。 どのようなSQLがスマートでしょうか。。 無知で申し訳ございませんが、ご教授いただけますと幸いです。 よろしくお願いいたします。

  • SQLで質問があります。

    すみません。初めて質問させて頂きます。 以下のような条件のSQL生成は可能でしょうか。 可能な場合どのようなSQLになるかご教授頂けないでしょうか。 <条件> テーブルA,B,Cで一致する社員コード AND テーブルAの年月日がnull AND テーブルBの区分コードが"01"以外 AND テーブルCの部門コードでテーブルDを検索し 取得した会社コードが"00001" <取得したい項目> テーブルA.社員コード テーブルA.社員氏名 テーブルC.区分コード <テーブルA> 社員コード* 会社コード 年月日 社員氏名 <テーブルB> 社員コード* 会社コード 区分コード <テーブルC> 社員コード* 会社コード 部門コード <テーブルD> 会社コード* 部門コード* *は主キー よろしくお願い致します。

  • SQLについて教えてください

    お世話になります。 SQLについて教えてください AテーブルとBテーブルからCテーブルを作成したいのですが、 KEYをキーにAテーブルのIDが1で、YYMMが一番新しい項目(最大の項目)を 取得し、Cテーブル作成したいのですが、どのようにするのでしょうか? Aテーブル    Bテーブル   Cテーブル KEY ID yymm   KEY     KEY YYMM AAA 0 200612  AAA     AAA 200611 AAA 1 200611  BBB     BBB 200611 AAA 1 200609 BBB 0 200611 CCC 1 200611

  • SQL文について

    Select文についての質問です。 テーブルA,B, Cがります。  Aテーブルのカラム A1,A2, A3  Bテーブルのカラム B1, B2, B3  Cテーブルのカラム C1,C2, C3 A1=B1,A2=B2の  A3,B3 と、 A1=C1でC3がNULLでないCテーブルの件数 を一度に取得したい場合、どのようなSQL文になるでしょうか。 よろしくお願いします。

  • 否定条件回避

    お世話になります。 エラーデータチェックのSQLを作成していますが、 難航しています。 バージョン:Oracle10.2 Aテーブル  a1 b1 c1 a2 b2 a3 b3 c3    Bテーブル a1 b1 a2 gg a3 上のように2つのテーブルがあるとします。 2つのテーブルの各項目がエラーあるかどうかをチェックします。 上の場合は2行目のレコードがエラーとし、取得したいです。 結合条件はa,b,c。ただどれもNULLの場合があって、3つのうち必ずどれかが値が入っています。A.a1とB.a1があっていれば、正常データとします。 大量データため、WHERE句に否定条件はちょっと厳しいです。 自分が考えたのはMINUS 例:SELECT * FROM Aテーブル LEFT JOIN Bテーブル   ON (A.a = B.a OR A.b = B.b OR A.c = B.c) MINUS SELECT * FROM Aテーブル LEFT JOIN Bテーブル ((ON A.a = B.a OR (A.a IS NULL OR B.a IS NULL)) (AND A.b = B.b OR (A.b IS NULL OR B.b IS NULL)) (AND A.c = B.c OR (A.c IS NULL OR B.c IS NULL))) 後々考えたらやっぱり抜けるところがある気がします・・・ どなたかご教授いただけると助かります。 よろしくお願いします。