階層関数

EQLでは、管理対象属性に対する階層関数がサポートされます。

特定の子または祖先でフィルタリングすることや、階層の特定レベルまたは相対レベルを返すこともできます。管理対象属性には、SELECT文の中やその他の場所で別名を付けることができます。

関連する関数は次のとおりです。

関数 説明
ANCESTOR(expr, int) 名前付き属性の、指定された深さにある祖先を返します。要求された深さが属性値の深さよりも大きい場合は、NULLが返されます。ルートの深さは0です。
HIERARCHY_LEVEL(expr) 名前付き属性のレベルを数値として返します。レベルとは、ルートからのパス上にある値の数です。ルートのレベルは常に0です。
TO_MANAGED_VALUE(attribute, value) 特定の管理対象属性と管理対象値を表すリテラルから、管理対象値リテラルを返します。両方のパラメータが文字列リテラルであることが必要です。
IS_DESCENDANT(expr, value) レコードが選択されるのは、名前付き属性が指定の属性であるか子であり、指定された値に一致する場合です。属性が、指定された階層のメンバーでない場合は、コンパイル時エラーになります。主キーを持つ属性が見つからない場合の結果はNULLになります。

この関数は、標準属性とともに使用することもできます。この場合は、レコードが選択されるのは指定された属性が存在しており、指定された値に一致する場合です。

IS_ANCESTOR(expr, value) レコードが選択されるのは、名前付き属性が指定の属性であるか祖先である場合です。属性が、指定された階層のメンバーでない場合は、コンパイル時エラーになります。主キーを持つ属性が見つからない場合の結果はNULLになります。

この関数は、標準属性とともに使用することもできます。この場合は、レコードが選択されるのは指定された属性が存在しており、指定された値に一致する場合です。

GET_LCA(expr1, expr2) この行関数は、2つの管理対象属性のLCA(最小共通祖先)を返します。2つの管理対象属性が同じ階層に属している必要があります。そうでない場合は、コンパイル時エラーになります。
LCA(attribute) この集計関数は、指定された属性列内の管理対象属性のLCAを返します。LCAとは、指定されたすべてのメンバーの祖先が存在する、最も階層の浅いレベルのことです。この関数では、NULL値は無視されます。

階層の例

例1: この例では、CAT_BIKES管理対象属性値でフィルタリングし、CAT_BIKESまたはその子が割り当てられたレコードをすべて取得します。
RETURN Results AS
SELECT
  ProductCategory AS PC,
  ARB(ANCESTOR(PC, HIERARCHY_LEVEL(ProductCategory)-1)) AS Anc
WHERE
  IS_DESCENDANT(ProductCategory, 'CAT_BIKES')
GROUP BY PC
ORDER BY PC
例2: この例では、ProductCategory階層のレベル1(ルートの1つ下のレベル)が返されます。
RETURN Results AS
SELECT
	 ProductCategory AS PC,
	 ANCESTOR(PC, 1) AS Ancestor 
WHERE
	 ANCESTOR(ProductCategory, 1) = 'CAT_BIKES'
GROUP BY PC
ORDER BY PC
例3: 3番目の例では、ProductCategory階層の直接の祖先を返します。
RETURN Results AS
SELECT
	 ProductCategory AS PC,
	 ANCESTOR(PC, HIERARCHY_LEVEL(PC) - 1) AS Parent
WHERE
	 ANCESTOR(ProductCategory, 1) = 'CAT_BIKES'
GROUP BY PC
ORDER BY PC

2番目と3番目の例では、重複排除のためにGROUP BYを使用しています。さらに、ProductCategory AS PCという別名を付けていますが、この別名をWHERE句では使用できないことに注意してください。この別名が使用可能になるのはWHERE句の実行後であるからです。

注意: GROUP BY文ではANCESTOR関数を使用できません。EQLでは式を使用したグルーピングはできないからです。
例4: この省略した例では、TO_MANAGED_VALUE関数の使用法を示します。
RETURN Results AS
SELECT
  HIERARCHY_LEVEL(TO_MANAGED_VALUE('ProductCategory', 'Bikes')) AS HL
...