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は、効果がありません。