SQLクエリの概要
SQLクエリの概要
このトピックを読む前に、「リストについての主要な概念」と「リストクエリを作成する」をお読みください。
FlexSimのリストクエリには、次のようなコンポーネントが含まれています。
たとえば、有効なクエリは次のようになります。
WHERE queuesize > 10
この例では、リストはリストからプルされるエントリを制限します。プルされるエントリは、含まれるアイテムが10を超えるキューにあるリストエントリのみです。
次のセクションでは、このクエリの各コンポーネントの目的について説明します。
SQL句
SQL言語は、句を使用して検索の実行に使用される何らかの論理的なルールを表します。通常、句はすべての文字が大文字のキーワードで始まります。SQLには異なる目的を持つさまざまな句がありますが、リストクエリを作成する場合に必要になるのは、一般的に2つの句のみです。
- WHERE - この句を使用して、リストからプルするエントリを制限します。
- ORDER BY - この句を使用してエントリを並べ替え、リストからプルするエントリに優先度を付けます。
これら2つの句の詳細については、「SQL句」を参照してください。
リスト上のフィールド
すべてのリストはフィールドを使用してリストエントリに関するデータを追跡します。リストを作成する際に、リストに含めるフィールドと、そのフィールドが追跡するデータを決定します。SQLクエリでは、リストエントリのフィルタリングまたは優先度付けで使用されるリスト上のフィールドを指定します。
演算子(任意)
演算子を使用して2つの値を比較したり、新しい値を作成したりできます。通常、WHERE句では演算子のみを使用してリストエントリをフィルタリングまたは制限します。比較結果が真であれば、リストエントリはプルされます。比較結果が偽の場合、リストエントリはプルされません。
演算子は、通常の基本的な数学演算子(+、-、*、/、=など)といくつかの追加の論理演算子で構成されます。リストクエリでは通常、演算子を使用してリストの値をクエリの値と比較します。クエリで使用できる演算子の詳細については、「演算子」を参照してください。
値(任意)
演算子に値を使用し、その値を(ORDER BY句ではなく)WHERE句でリスト上のフィールド値と比較します。比較結果が真の場合、その値はリストからプルされる可能性があります。結果が偽の場合は、リストからプルされません。
SQL句
SQLでは、句と呼ばれる要素を使用してクエリを定義します。各句は、クエリが検索の実行に使用するルールを表します。標準SQLではさまざまな句を使用できますが、リストを使用する場合に知っておく必要があるのは通常、WHEREとORDER BYの2つのみです。
WHERE句
WHERE句は基本的に、リストから何をプルするのかを定義します。クエリにWHERE句を使用してリストからプルする場合、基本的に、「エントリがこの基準を満たす場合(where)、リストから何かをプルします」と指定しています。たとえば、値が3でラベル名がtypeのアイテムのみをプルするプロセッサでは、次のクエリを使用できます。
WHERE type == 3
このWHERE句は、typeラベルが3に等しいアイテムのみをプルするルールを定義します。つまり、リスト上のtypeフィールドに、3と等しい値が含まれている必要があります。
ORDER BY句
ORDER BY句は基本的に、プルする候補が複数ある場合の優先度付けを定義します。クエリにORDER BY句を使用してリストからプルする場合、基本的に、「リストからプルするエントリが複数ある場合は、このルールでエントリの順番(order by)を決めます」と指定しています。たとえば、ageフィールドを使用してリストでの待機時間が最短のエントリをプルする場合は、次のクエリを使用できます。
ORDER BY age ASC
このORDER BY句は、最も低いageでリストのアイテムを優先度付けします。つまり、プルクエリは、リストのエントリをageフィールドの値で昇順に並べ替え、その結果並べ替えられたリストの最初のアイテムをプルします。ASCキーワードはエントリを昇順(デフォルト)で並べ替えるようにリストに指示するオプションです。代わりにDESCキーワードを使用して降順で並べ替えることもできます。
複数の句とルールを結合する
次のセクションで説明するように、必要に応じてさまざまなルールと句を組み合わせるとより複雑なSQLクエリを作成できます。
複数のフィールドによる順番
ORDER BY句では、一度に複数のフィールドでリストエントリを簡単に優先度付けできます。複数のフィールドはカンマを使用して区切ることができます。例:
ORDER BY type ASC, age DESC, queueSize DESC
このクエリは次を実行します。
- リストはまず、
type
フィールドを使用してエントリを昇順に並べ替えます(typeが1のアイテムが最初にプルされてからtypeが2のアイテムがプルされるなど)。 - その最初のフィルタリングを適用した後、2つのエントリに同じtypeがある場合、リストは次に
age
フィールド使用してエントリを降順に並べ替えます(リストでの待機時間が最長のアイテムが最初にプルされます)。 - 最後に、2つのエントリに同じtypeとageがある場合、リストは
queueSize
フィールドを使用してエントリを降順に並べ替えます(最も大きいキューから最初にアイテムがプルされます)。
WHERE句とORDER BY句の両方を使用する
WHERE句とORDER BY句の両方を使用するクエリを定義する場合は、WHEREを最初に配置してそのすぐ後ろにORDER BYを配置します(次の例を参照)。
WHERE type == 3 ORDER BY age ASC
このクエリは、typeが3のアイテムのみをプルし、その条件を満たすアイテムが複数ある場合は、ageが最も小さいアイテムをプルするように指定しています。
演算子
次の表に、プルクエリで使用できる演算子を示します。
比較演算子
演算子 | 定義 | 例 |
---|---|---|
=または== | 等しいかどうかを比較 | WHERE type == 2 |
< | より小さいかどうかを比較 | WHERE type < 2 |
> | より大きいかどうかを比較 | WHERE type > 2 |
<= | 以下であるかどうかを比較 | WHERE type <= 2 |
>= | 以上であるかどうかを比較 | WHERE type >= 2 |
<>または!= | 等しくないかどうかを比較 | WHERE type <> 2 |
BETWEEN | 定義された値の範囲(値も含める) | WHERE type BETWEEN 2 AND 5 |
IN | 定義されたセット内の値 | WHERE type IN (1, 3, 5) |
論理演算子
演算子 | 定義 | 例 |
---|---|---|
ANDまたは&& | 論理AND | WHERE type == 2 AND queueSize < 5 |
ORまたは|| | 論理OR | WHERE type == 2 OR queueSize < 5 |
数学演算子
演算子 | 定義 | 例 |
---|---|---|
+ | 加算 | ORDER BY distance + age |
- | 減算 | ORDER BY distance - age |
* | 乗算 | ORDER BY distance * age |
/ | 除算 | ORDER BY distance / age |
式のグループ化
演算子 | 定義 | 例 |
---|---|---|
() | グループ化する括弧 | WHERE (type < 2 OR type > 8) AND queueSize < 5 |
FlexScript関数
クエリでFlexScript関数呼び出しを使用することもできます。これは、標準セットにはない数学演算でよく使用されます。たとえば、最初に距離で並べ替えて(プルしているプロセッサの現在の場所に最も近いアイテムを見つける)、ある程度のしきい値になったら別のルールで並べ替えることができます。たとえば、具体的に距離をそれぞれ10mのパーティションに分割できます。同じパーティション内のアイテムはLIFO順に(age ASC)プルされます。ここではround()関数を使用して10mごとに距離を丸めてから、2番目の優先度のageを使用します。
ORDER BY round(distance / 10) ASC, age ASC
SELECT句
特別な状況によっては、SELECT句を使用することもできます。詳細については、「機能参照」を参照してください。