ORDER BY
句は、結果レコードの順序を制御するために使用します。
属性名または任意の式を指定して、結果レコードをソートできます。
ORDER BY
構文は、次のとおりです:
ORDER BY <Attr|Exp> [ASC|DESC] [,<Attr|Exp> [ASC|DESC]]*
ここで、Attr|Expは属性名または任意の式です。 属性は、単一割当て属性または複数割当て属性のいずれかです。
オプションで、昇順(ASC
)または降順(DESC
)のどちらでソートするかを指定できます。 値とソート順序を任意に組み合せて使用できます。 方向がないことは、ASC
を示します。
ORDER BY
句の動作は次のとおりです:
ORDER BY
句がないレコード)は、任意ですが安定した方法で順序付けられます: 同じバージョンのデータに対して問合せを実行しているかぎり、同じ問合せの結果が常に同じ順序で戻されます。
RETURN Results AS SELECT SUM(Price) AS Total FROM WineState GROUP BY WineType ORDER BY Total DESC
Total WineType --------------------------- | 142.34 | Red | | 97.97 | White | | 52.90 | Chardonnay | | 46.98 | Brut | | 25.99 | Merlot | | 21.99 | Bordeaux | | 16.99 | Blanc de Noirs | | 14.99 | Pinot Noir | | | Zinfandel | ---------------------------
Zinfandelバケットは、価格にNULL値があるため、最後にソートされます。 ソート順序がASC
であれば、Zinfandelはそのまま結果の最後に配置されます。
ジオコード・ソート
式のソート
ORDER BY
句を使用すると、任意の式を使用して結果のレコードをソートできます。 ORDER BY
句の式では、次の簡単な文に示すように検索式を使用することを除き、ローカル文の属性のみを参照できます:
/* Invalid statement */ DEFINE T1 AS SELECT ... AS foo FROM SaleState; RETURN T2 AS SELECT ... AS bar FROM T1 ORDER BY T1.foo /* not allowed */ /* Valid statement */ DEFINE T1 AS SELECT ... AS foo FROM SaleState; 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 */
セットでソート
前述のように、セット(複数割当属性)を基準にソートする場合、任意の安定した順序が使用されます。
RETURN Results AS SELECT SET(Price) AS PriceSet FROM WineState GROUP BY WineType ORDER BY PriceSet DESC
PriceSet WineType ---------------------------------------------------------------------- | { 14.99 } | Pinot Noir | | { 12.99, 13.95, 17.5, 18.99, 19.99, 21.99, 9.99 } | Red | | { 25.99} | Merlot | | { 22.99, 23.99 } | Brut | | { 21.99 } | Bordeaux | | { 20.99, 32.99, 43.99 } | White | | { 16.99 } | Blanc de Noirs | | { 17.95, 34.95 } | Chardonnay | | | Zinfandel | ----------------------------------------------------------------------
この降順では、Zinfandelバケットは最後にソートされます。これは、価格割当がないためです(したがって、空のセットが返されるためです)。
ORDER BYの安定性
EQLによって、文の結果が問合せに対して安定していることが保証されます。 これは次のことを意味します:
ORDER BY
句が指定されていない場合や、ORDER BY
句で指定された順序に一致する場合でも、同じ文が繰返し問合せの結果を同じ順序で返します。
たとえば、ORDER BY
句がない文で、PAGE(0, 10)
、PAGE(10, 10)
、PAGE(20, 10)
の順に使用する問合せの場合、更新を行わずにPAGE(20, 10)
は同じ任意の安定した結果から10レコードの連続グループを返します。
ORDER BY Num PAGE(3, 4)
を使用する文の場合、初期問合せでレコード {5, 6, 7, 8}が返されます。 次に更新されて、4 (指定されたページの前)のレコードが挿入され、(指定されたページの) 6のレコードが削除され、9 (指定されたページの後)のレコードが挿入されます。 更新後の同じ問合せの結果は、 {4, 5, 7, 8}となります。 この理由は次のとおりです。
ORDER BY
は、RETURN
句の結果またはPAGE
句の影響にのみ影響します。 PAGE
句を含まないDEFINE
上のORDER BY
は、効果がありません。