プライマリ・コンテンツに移動
Oracle® Big Data Discovery Cloud Service EQLリファレンス

E65371-04
目次へ
目次
索引へ移動
索引

前
次
機械翻訳について

LET句

LET句では、文の他の場所で使用される可能性があるが、必ずしも文の結果に出現する必要がない属性が定義されます。

LETの主な目的は、計算対象属性の値でのグループ化(および特に計算対象属性のMEMBERSによるグループ化)を容易にすることです。 ただし、LETは文の中で使用できる一時的な値を定義するために、グループ化されているものもそうでないものもあります。

構文は次のとおりです。
LET <expression> [AS <attribute>][, <expression> [AS <attribute>]]*
LETは、次の例のように、SELECT句の直前の文に記述できます:
RETURN Results AS
LET
   x + y AS intermediateSum
SELECT
   MIN(x) AS min_x,
   intermediateSum + z AS finalSum
FROM WineState
GROUP BY finalSum
「結果」文の出力には、min_xfinalSumの2つの属性のみが含まれています。 LETバウンドの属性intermediateSumは出力に表示されません。
このプロパティが存在する場合、LETSELECT句の直前(前述の例を参照)に配置され、その後に1つ以上の属性定義をカンマで区切って指定する必要があります。 これらの属性定義は、SELECTの後に表示される定義とまったく同じように機能します。 特に、定義の左側の式がbare属性参照(オプションでdata-source修飾子)である場合、定義のAS句はオプションです。 つまり、次のように記述できます:
LET x,
  State.y AS y,
  3 as z
これは、次の操作に相当します:
LET x AS x,
  State.y AS y,
  3 as z

LET属性は、文のWHERE句(使用する場合)の直後、およびSELECT属性のいずれかが計算される前に即座に計算されます。

グループ化の前にLET属性が計算されるため、AVGSUMのようなアグリゲータはLETの句では無効になり、EQLはそのコンテキストにエラーがある場合にシグナルします。

LET範囲指定

LETで定義される属性は、次のようにスコープ内にあります:
  • 同一文内の後続のすべてのLET定義
  • 同一文内のすべてのSELECT定義が対象
  • MEMBERSを含むGROUP BY句は、同じ文で記述します。

また、LET属性がグループ化キーとして使用されている場合は、文の結果にも表示され、ORDER BYおよびHAVING句で使用できます。 属性がグループ化キーでない場合は、ORDER BYまたはHAVINGのスコープ内ではありません。

この例は、LETスコープ指定のルールを示しています:
RETURN results AS
LET
  (FOREACH d IN orderDates RETURN (EXTRACT(d, YEAR))) AS orderYears
SELECT
  MAX(totalCost) AS maxCost
FROM OrderHistory
GROUP BY orderYears
HAVING 2014 IN orderYears

この例では、データソースOrderHistorymdex:dateTime-setタイプの属性orderDatesが定義されているものとします。 orderYears属性の定義により、orderDatesの各日付から年が抽出され、これらの年がセットに再割当されます。 この文では、受注年のセットで結果をグループ化し、それぞれの最大原価を計算し、orderDatesで2014年の少なくとも1日を持つオーダーに対する行を返します。 orderYearsはグループ・キーであるため、出力表には2つの属性(maxCostおよびorderYears)、orderYearsHAVING句で使用できます。

別の方法として、次の例を考えてみます:
RETURN results AS
LET
  (FOREACH d IN orderDates RETURN (EXTRACT(d, YEAR))) AS orderYears
SELECT
  MAX(totalCost) AS maxCost
FROM OrderHistory
GROUP BY MEMBERS(orderYears) AS yr

この文は前の例と同じですが、orderYearsではなくメンバーによってグループ化される点が異なります。 したがって、orderYearsはグループ・キーではなく、グループ・キーyrのコンピュートにのみ使用されます。 したがって、orderYearsは文の出力には表示されず、HAVINGまたはORDER BYのいずれの句にも表示できません。 (文の出力には、yrmaxCostという2つの属性が含まれています。)

前述のルールを要約: 非グループ化文では、LET属性は出力に表示されず、HAVINGおよびORDER BY句に表示されることもありません。