クエリ レイヤーのパラメーターの定義

クエリ レイヤーのソースを定義する SQL ステートメントは静的です。 しかし、SQL ステートメントの一部が事前にわからない場合があります。 たとえば、集約された降水量を表示する場合、マップ ユーザーが、日、週、月のいずれで測候所の降水量の値を集約したいのかがわからないことがあります。 クエリ レイヤーのパラメーターを使用することにより、SQL ステートメントの構成要素が動的になります。 クエリ パラメーターを、クエリが実行されるときに値が定義される SQL ステートメント変数と見なすことができます。 クエリ パラメーターのタイプは、次の 2 つです。

  • 範囲パラメーターは、数値または時間値レンジ スライダーおよびタイム スライダーに動的に接続します。 たとえば、SQL クエリに範囲パラメーター WHERE ::r:myRangeVar1 が含まれるとします。 データベースに送信される SQL クエリは、レンジ スライダーで渡される値が 1 つであるか 2 つであるかによって、WHERE aField = value または WHERE aField => value1 AND aField <= value2 となります。
  • 不連続パラメーターは、クエリが実行されるときにリテラル値でクエリを更新します。 たとえば、クエリ レイヤーを定義する SQL クエリに 2 つの不連続パラメーター WHERE city_population > ::population AND state_name = ::name が含まれるとします。 各パラメーターに 10000California の値が指定される場合、データベースに送信される SQL クエリは WHERE city_population > 10000 AND state_name = 'California' です。

注意:

クエリ レイヤーは、クエリ レイヤーを作成するときに指定される SQL クエリで定義されます。 クエリ レイヤーは [クエリ レイヤーの作成 (Make Query Layer)] ジオプロセシング ツールを使用して作成できますが、このツールを使用してパラメーターを定義することはできません。 SQL ステートメントのパラメーターを使用するには、[クエリの編集] ダイアログ ボックスでクエリ レイヤーを変更します。

集約値を日付範囲、時間範囲、または数値範囲によって参照できるクエリ レイヤーが必要な場合は、[集約クエリ レイヤーの作成 (Make Aggregation Query Layer)] ジオプロセシング ツールを使用して、動的集約が有効なクエリ レイヤーを構築し、クエリ パラメーターを定義して、結果を表示します。

範囲パラメーター

範囲パラメーターは、数値 (integer または double) または日時値のいずれかを使用して、タイム スライダーまたはレンジ スライダーでデータを動的に表示します。 範囲パラメーターは、フィールドまたは式への参照なしで宣言されています。また、SQL クエリで論理演算子は使用されません。 その代わりに、フィールドまたは式がパラメーターのプロパティとして設定されます。 範囲パラメーターの先頭には、キーワード ::r: が付けられます。 SQL クエリの WHERE 句が SELECT リストに属さないフィールドを利用する場合に範囲パラメーターを使用します。

例: WHERE ::r:MyRangeParameter

範囲パラメーターを宣言するときに、フィールドまたは式およびデータ タイプを指定し、必要に応じて、スライダーで使用するデフォルト値とエイリアスを指定する必要があります。 [デフォルト値] をクリックして、デフォルト値の最小値と最大値を入力します。 このチェックボックスをオンにすると、式を整合チェックできるよう少なくとも 1 つの値を入力する必要があります。 デフォルト値は、値リテラル (実際の数字または日付) か、指定したデータ タイプの値を返す式のいずれかです。

以下の手順は、「earthquakes」という名前のテーブルで範囲パラメーターを定義する方法を示しています。ここでは、デフォルトの期間である過去 7 日間以内に発生した地震を表示し、必要に応じて、タイム スライダーを使用してこの期間を変更します。

  1. [マップ] タブの [レイヤー] グループで、[データの追加] メニューを開いて、[クエリ レイヤー] をクリックします。
  2. [接続] メニューで、データベース接続を選択するか、[新しいジオデータベース接続] 新しいジオデータベース コネクション を使用して接続を作成します。
  3. [名前] フィールドに、「Earthquakes」と入力します。
  4. [クエリ] ボックスに、「select * from EARTHQUAKES where ::r:EQDateRange」と入力します。
  5. コードの ::r:EQDateRange パラメーターにマウス ポインターを合わせ、[クエリの編集] メタデータの編集 をクリックしてプロパティを編集します。
  6. 次のパラメーターのプロパティを入力します。
    1. [フィールドまたは式] に、日時フィールドの名前を入力します。
    2. [データ タイプ] で、[日付] を選択します。
    3. [デフォルト値] をオンにします。
    4. 使用中のデータベースに応じて、デフォルト値の式を入力します。

      次の表で、いくつかのデータベースの例を説明します。 クエリ レイヤーを使用するように構成可能なデータベースの全リストについては、「クエリ レイヤーを使用するようデータベースとクライアントを構成する」をご参照ください。

    データベース開始値終了値

    Microsoft SQL Server

    dateadd(dd, -7, cast(getdate() as date))cast(getdate() as date)

    Oracle

    trunc(CURRENT_DATE) - INTERVAL '7' DAY trunc(CURRENT_DATE)

    PostgreSQL

    CURRENT_DATE - INTERVAL '7 days'CURRENT_DATE

  7. [完了] をクリックします。
  8. [整合チェック] をクリックして、SQL クエリと範囲の定義が有効かどうかを確認します。
  9. [次へ] をクリックします。
  10. [一意識別子フィールド][ジオメトリ タイプ]、および [空間参照] を指定して、[完了] をクリックします。

これで、タイム スライダーを使用して、任意の期間に移動し、発生した地震を表示できます。 [時間の無効化] ボタン マップ時間 をクリックすると、設定されているデフォルトの期間内 (この例では、過去 7 日間) の地震を表示できます。

注意:

1 つのクエリ レイヤーで複数の範囲パラメーターを宣言することができますが、日時値を参照できるのはそのうちの 1 つのみです。

範囲パラメーターの詳細プロパティ

クエリの整合チェックに失敗した場合、範囲パラメーターの一部の詳細プロパティを指定する必要がある場合があります。 パラメーターのプロパティの [高度な設定] セクションを展開して、フィールドが属するテーブルの名前を指定します。 これにより、最小値と最大値をテーブルから直接取得できます。 これにより、特にパラメーターがネストされたクエリ内にある場合に効率が向上します。 また、デフォルト値が指定されていない場合、[高度な設定] 見出しで、パラメーターの値がないときに使用する式を指定する必要があります。 式でパラメーターを 'TRUE' に解決する [1=1] (デフォルト) か、パラメーターを 'FALSE' に解決する [1=0] のいずれかを選択します。

不連続パラメーター

不連続パラメーターには、数値 (integer または double)、日付値、または文字列値を使用します。不連続パラメーターの先頭には、キーワード :: が付けられます。 不連続パラメーターは、SQL 演算子を使用するフィールドまたは式とペアになっています。 フィールド値を更新して、マップに描画されているデータをフィルタリングできます。

不連続パラメーターを宣言するときに、データ タイプとデフォルト値を指定する必要があります。 実行時にレイヤーの選択リストを表示するには、SQL の IN 演算子を使用し、[複数値を許可] をオンにします。 必要に応じて、パラメーター名の代わりに使用するエイリアスを指定します。 以下に例を示します。

  • WHERE aFieldName = ::var1
  • WHERE AdminField IN ::AdminAgency

定義済みの不連続パラメーター

独自の不連続パラメーターの宣言に加えて、クエリで使用できる定義済みの 2 つの不連続パラメーターがあります。 view_extent パラメーターはクエリの空間フィルターを指定し、非常に大きいデータセットを操作するときのパフォーマンスを大幅に向上させることができます。 view_scale パラメーターを使用すると、クエリ内の現在のマップ縮尺にアクセスできます。 これらの変数は、2D マップのコンテキストでのみ考慮されます。 3D シーンでは無視されます。

view_extent

レイヤーをマップ上で表示すると、データベースに送信される SQL クエリの末尾に空間フィルターが追加されています。 これで十分ですが、集約対象を現在の範囲に表示されているフィーチャに制限したい場合もあります。 このような場合は、view_extent パラメーターをクエリに追加して、現在の範囲に空間的に制限することができます。

必要に応じて、::view_extent をクエリ内の任意の場所に何度でも追加できます。 カスタムの不連続パラメーターとは異なり、設定するプロパティはありません。パラメーターのデフォルト値は NULL です。

データベースに送信される SQL クエリは、::view_extent をレイヤーと同じ空間参照内の WKT (Well-Known Text) 形式のポリゴンに置き換えます。 データベース固有の関数と空間参照 ID (SRID) を使用して、WKT 範囲ポリゴンからジオメトリを作成します。 以下は、SQL Server および PostgreSQL データベース タイプの例です。

  • SQL Server: WHERE shape.STWithin(geometry::STGeomFromText(::view_extent, 4326)) = 1
  • PostgreSQL: WHERE ST_Within(shape, ST_GeomFromText(::view_extent, 4326))

view_scale

現在のマップ縮尺に基づいて Where 句または選択済みのフィールドを変更する場合、view_scale 定義済みパラメーターを使用します。 このパラメーターを使用する場合、デフォルト値 0 が渡されます。 その他に設定するプロパティはありません。 このパラメーターは、SQL クエリで必要な回数だけ指定できます。 次の例では、view_scale パラメーターを SQL Server および PostgreSQL データベース タイプで使用しています。

  • SQL Server: WHERE IIF(::view_scale > 100000, <do this>, <do that>)
  • PostgreSQL: WHERE (CASE WHEN ::view_scale >= 100000 THEN <do this> WHEN ::view_scale >= 50000 AND ::view_scale < 100000 THEN <do that> ELSE <do the other thing> END)

クエリ レイヤーへのパラメーターの追加

クエリにパラメーターを追加するには、次の手順に従います。

  1. [コンテンツ] ウィンドウでレイヤーを右クリックし、[プロパティ] プロパティ をクリックします。
  2. [ソース] タブで、テーブルの [クエリ] 行の [クエリの編集] メタデータの編集 をクリックします。

    クエリは、[クエリ] テキスト ボックスに表示されます。

    ヒント:

    クエリの文字を読みやすくするには、Ctrl キーを押したままマウス ホイール ボタンを前方向に回転させることで表示を拡大できます。

  3. コードの位置にポインターを置き、範囲パラメーターに ::r:<name> と入力するか、不連続パラメーターに ::<name> と入力します。

    パラメーターが SQL クエリに太字で表示され、その横に [編集] ボタン メタデータの編集 が表示されます。

  4. [編集] ボタンをクリックして、パラメーターのプロパティにアクセスします。
  5. パラメーターのプロパティを設定して、[完了] をクリックします。

    [デフォルト値][データ タイプ] は必ず定義する必要があります。 他のプロパティはオプションです。

  6. [クエリの編集] ダイアログ ボックスで、[整合チェック] をクリックしてエラーがないか確認します。
  7. 引き続きレイヤーの空間プロパティを設定して、完了したら [完了] をクリックします。

関連トピック