メニューボタン
IBMi海外記事2017.09.14

条件付きSQL結合

Ted Holt 著

SQLの結合は、2つ以上の結果セットを1つに結合します。それが、結合の本来的な機能です。しかし、結合はまた、別の結果セットを選ぶ方法、すなわち実行時にSELECTステートメントを有効化または無効化する方法も提供します。私はこの機能を数多くの場面で利用してきました。ここでは、結合のそのような使い方について説明します。

まず、結合の性質について考えてみます。結合のそれぞれの結果セットは、WHEREおよびHAVING節の基準に応じて、データを返すことも、データを返さないこともあります。SELECTがデータを取得しない場合、システムは結合の結果に空のセットを追加します。SELECTをオンまたはオフにするための方法は、WHEREおよびHAVING節の選択基準をコントロールすることです。

いつものように例を使用します。シンプルなクエリーから始めましょう。ミネソタ州およびニューヨーク州在住の顧客をリストアップしてみましょう。これは、非常にシンプルなクエリーになるでしょう。

技術情報code01

一方の州または両方の州に顧客がいる場合、結果セットを受け取ります。

State City CusNum LstNam
MN アイル 846283 アリソン
MN アイル 583990 エイブラハム
NY クレイ 839283 ジョーンズ
NY ヘクター 397267 タイロン
NY ヘクター 192837 リー

それら2つの州在住の顧客がいない場合、どの行(レコード)もWHERE節に一致しないため、空のセットを受け取ります。

空であるかデータが入っているかにかかわらず、結果セットがGUIフォームでグリッドをロードするとします。結果セットにデータが入っている場合、ユーザーは顧客のリストを受け取ります。結果セットが空の場合は、ユーザーに対する思いやりの意味で、ユーザーにメッセージを表示します。コンピューターが要求を処理しようとしてくれているのかどうか、ユーザーが不安に思わないようにするためです。

技術情報code02

違いを見てみてください。SELECTを、Selectedという共通表式に移動しました。

技術情報code03

私は、アカウント番号の数値を文字へ変換することにしました。これは必ずしも必要なことではありませんが、結合を多少スムーズにします。 ここでは共通表式を照会します。

技術情報code04

FROM節は2つのSELECTステートメントを結合します。1つ目のSELECTステートメントは、Selectedのデータを読み取るため、結果セットを返す場合と、返さない場合があります。2つ目のSELECTステートメントは、共通表式が空の場合に、1つの行の結果セットを返します。

技術情報code05

このステートメントは、少し奇妙に見えるかもしれません。このステートメントのHAVING節には、GROUP BYがありません。そのようなケースでは、入力セット全体(ここでは共通表式Selected)は1つのグループとみなされ、SELECT節にはリテラルおよび集約関数のみ指定できます。GROUP BYがないことが気になるようなら、以下を追加することができます。

技術情報code06

結果セットが空だった場合、グリッドは次のように表示されます。

State City CusNum LstNam
No data      

結果としては、2つのSELECTステートメントのうちの1つ(1つのステートメントだけ)がデータを返します。

あわせて読みたい記事

PAGE TOP