• ベストアンサー

UNION ALLのように順番がありNULLを返す方法

SQL初心者です。ACCESSデータベースに対するクエリを書いているのですが、 条件を配列として、その配列の順番に応じたSELECT文を書きたいのです。 SELECT * FROM access_db WHERE ID = '条件' UNION ALL SELECT * FROM access_db WHERE ID = '条件' UNION ALL SELECT * FROM access_db WHERE ID = '条件' UNION ALL... といった具合にSQL文を作成しているのですが、これでは見つからない条件がある場合に、行が繰り上がり条件を格納した配列とはずれが生じてしまいます。 見つからなかった場合にNULLまたはそれを表せる何かを抽出結果として組み込むことはできますか? SQL初心者のためUNION ALL程度しか近いものが見つけられなく、困っています。 どなたかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

条件だけを格納したテーブルを作り、これと LEFT JOIN するのが、 スッキリした方法です。但し、そのような方法がとれない場合は チョット強引なやり方ですが、以下をお試しください。 SELECT B.* FROM (SELECT TOP 1 '条件1' AS C FROM access_db) AS A   LEFT JOIN access_db AS B ON A.C = B.ID UNION ALL SELECT B.* FROM (SELECT TOP 1 '条件2' AS C FROM access_db) AS A   LEFT JOIN access_db AS B ON A.C = B.ID UNION ALL ・・・

make_midi
質問者

お礼

"条件だけを格納したテーブルを作り、これと LEFT JOIN するのが、 スッキリした方法です。" という、文面からヒントを得て、こちらで解決致しました。 ちょっと質問とは違う出力結果になりましたが、 以前考えていたものより、効率的な結果が得られました。 配列にズレが生じないように、 keyとなるものを同時に抽出するという方法で対処しました。 ありがとうございました。

その他の回答 (1)

  • nfushi
  • ベストアンサー率31% (39/122)
回答No.1

UNION ALLではなくORやINを使用されてはどうでしょうか? SELECT * FROM access_db WHERE ID = '条件1' OR ID = '条件2' OR ID = '条件3' OR ID = '条件4' //////////// SELECT * FROM access_db WHERE ID IN ('条件1','条件2','条件3','条件4')

make_midi
質問者

補足

この時に焦っていたため、質問の意図が判りにくいかもしれません。 申し訳ありません。 この場を借りて、質問の補足をさせていただきます。 私が実現したいのは、UNION ALL で結合された条件付SELECT文に対し、 その条件に一致するものがなければNullの結果フィールドを返すといったものです。 つまり、条件1、条件2、条件3、、、といった条件を格納した 配列があるとして、それに対し 条件1で抽出された値、条件2で抽出された値、条件3で抽出された値、、、 といったように"ずれ"のない結果が欲しいのです。 UNION ALL で見つかったものを順番に返すといった結果は得られたのですが、 見つからなかった場合にそのことを教えてもらう方法がわからないため、 条件が20あった場合に結果が18しかないということになってしまいます。 Nullを返すというのが無理ならば、"about no match"といった文でも良いのですが・・・。

関連するQ&A