ORDER BY句

ORDER BY句は、結果レコードの順序を指定するときに使用します。

結果レコードをソートするには、属性名または任意式を指定します。

ORDER BYの構文は次のとおりです。
ORDER BY <Attr/Exp> [ASC/DESC] [,<AttrExp> [ASC/DESC]]*

Attr/Expは、属性名または任意式です。

必要に応じて、ソート順を昇順にするか(ASC)、降順にするか(DESC)を指定できます。任意の値の組合せとソート順序を使用できます。方向を指定しない場合は、ASCであると見なされます。

ORDER BY句が使用されているときは、ソート後の属性のNULL値の順序は常にNULL以外の値の後になり、NaN(not-a-number)値の順序は常に、NaNでもNULLでもない値の後になります。これは、ソートの方向とは無関係です。同順位である範囲(または、ORDER BY句が省略された場合のすべてのレコード)の順序は不定ですが、変動することはありません。同じ問合せから返される結果の順序は、その問合せの対象データのバージョンが同じであれば、常に同じです。データの更新では、レコードが順番に追加または削除されますが、変更されていないレコードの順序が変化することはありません。

この例では、販売員ごとに金額が計算されます。結果のレコードは、降順の合計金額でソートされます。
RETURN Reps AS
SELECT SUM(Amount) AS Total
GROUP BY SalesRep
ORDER BY Total DESC

文字列のソート

文字列値は、Unicodeコード・ポイント順にソートされます。

ジオコードのソート

データ型がgeocodeの場合は、緯度順にソートされ、次に経度順にソートされます。geocodeデータを使用するときに、より意味のあるソート順を確立するには、ある地点からの距離を計算してから、その距離の順にソートします。

式のソート

ORDER BY句では、任意式を使用して結果レコードをソートできます。ORDER BY句の中の式で参照できるのは、ローカル文の属性のみです。ただし、LOOKUP式の場合を除きます。次に単純な文の例を示します。
/* Invalid statement */
DEFINE T1 AS
SELECT ... AS foo

RETURN T2 AS
SELECT ... AS bar
FROM T1
ORDER BY T1.foo  /* not allowed */

/* Valid statement */
DEFINE T1 AS
SELECT ... AS foo

RETURN T2 AS
SELECT ... AS bar
FROM T1
ORDER BY T1[].foo  /* allowed */
加えて、式の中では集計関数を使用できません。次に例を示します。
RETURN T AS
SELECT ... AS bar
FROM T1
ORDER BY SUM(bar) /* not allowed because of SUM aggregation function */

RETURN T AS
SELECT ... AS bar
FROM T1
ORDER BY ABS(bar) /* allowed */

ORDER BYの一定性

EQLでは、文の結果は問合せごとに変化しないことが保証されます。つまり、次のようになります。

たとえば、ORDER BY句がない文に対して、PAGE(0, 10)を使用する問合せを実行し、PAGE(10, 10)を使用してからPAGE(20, 10)を使用した場合に、更新が何もなければ、同じ結果(不定であるが変動はしない)から、10レコードのグループが順番に返されます。

更新がある場合の例を示します。文でORDER BY Num PAGE(3, 4)が指定されており、最初の問合せでレコード{5, 6, 7, 8}が返されたとします。更新時に、4のレコードが挿入され(指定されたページの前)、6のレコードが削除され(指定されたページ上)、9のレコードが挿入された(指定されたページの後)とします。同じ問合せの結果は、この更新後は{4, 5, 7, 8}になります。この理由は次のとおりです。
  • 4を挿入したことによって、以降の結果が1つずつ下にシフトします。オフセットが3であるため、新しいレコードが結果に含まれます。
  • 6を削除したことによって、以降のすべての結果が1つずつ上にシフトします。
  • 9を挿入しても、この結果に含まれる、またはその前のレコードには影響はありません。

ORDER BYは、RETURN句の結果またはPAGE句の処理にのみ影響することに注意してください。PAGE句を指定していないDEFINEORDER BYを使用しても、何の影響もありません。