SAP HANA SQL関数:種類と例

⚡ スマートサマリー

SAP HANA SQL関数は、データをアプリケーション層に移動することなく、クエリ内の値を変換します。データ型変換、日付と時刻、全文検索、数値、文字列、ウィンドウ、およびその他の操作を網羅する7つのカテゴリがあります。

  • 🔄 変換関数: CAST、TO_BIGINT、TO_ALPHANUM、およびTO_BINARYは、あるデータ型から別のデータ型に値を変換します。
  • 📅 日付時刻機能: ADD_DAYS、ADD_MONTHS、およびADD_SECONDSは、日付と時刻の値をシフトまたは再フォーマットします。
  • 🔍 全文検索機能: SCOREおよび関連関数は、テキスト検索によって返された結果をランク付けします。
  • 🔢 数値関数: ABS、ROUND、POWERは数値入力を受け付け、数値結果を返します。
  • 🔤 文字列関数: ASCII、CHAR、およびCONCATは、文字入力を処理し、派生値を返します。
  • 🪟 ウィンドウ関数: RANK、DENSE_RANK、およびROW_NUMBERは、結果セットをウィンドウパーティションに分割します。
  • 🧰 その他: CONVERT_CURRENCYとCURRENT_SCHEMAは、他の6つのグループに属さないタスクを処理します。

SAP HANA SQL関数

SAP HANA SQL関数

SAP HANAは以下の機能を提供します SAP HANA機能 -

  1. データ型変換関数 – データ型変換関数は、あるデータ型を別のデータ型に変換するために使用されます。 以下はデータ型変換関数のリストです (CAST、TO_ALPHANUM、TO_BIGINT、TO_BINARY など)。
  2. 日付時刻関数 – 日付/時刻関数は、日付/時刻を別の形式に変換するために使用されます。例:ADD_DAYS、ADD_MONTHS、ADD_SECONDなど。
  3. フルテキスト関数 – 全文検索機能はテキスト検索に使用されます。例:SCOREなど。
  4. 数値関数 – 数値関数は、数値または数字を含む文字列を入力として受け取り、数値を返します。例:ABS、ROUND、POWERなど。
  5. 文字列関数 – 文字列関数は、文字列を入力として受け取り、処理を行い、関数に応じて値を返します。(例:ASCII、CHAR、CONCATなど)
  6. ウィンドウ関数 – ウィンドウ関数を使用すると、クエリの結果セットをウィンドウパーティションと呼ばれる行のグループに分割できます。例:RANK()、DENSE_RANK()、ROW_NUMBER()など。
  7. その他機能- 他にも、さまざまなジョブに使用される関数がいくつかあります。例: CONVERT_CURRENCY、CURRENT_SCHEMA など。

上記の関数はすべてデータベースエンジン内で評価されるため、ロジックを関数に組み込む方が、行を取得してアプリケーションで処理するよりもほぼ常に高速です。以下の例では、実際のデータに触れることなく式をテストするためだけに存在する、単一行のシステムテーブルであるDUMMYテーブルを使用しています。

スカラー関数、集計関数、ウィンドウ関数

例を挙げる前に、クエリにおける関数の動作を決定する重要な要素が1つあります。それは、入力される行数と出力される行数です。

カテゴリー 入力行数:出力行数 グループ化が必要ですか?
スカラー 1列から1列へ いいえ アッパー、ラウンド、今日まで、キャスト
集計 1行に多数の行 はい、ただしセット全体が1つのグループである場合は除きます。 和、 AVG、カウント、最小値、最大値
ウィンドウ 多数の行から多数の行へ いいえ、代わりにOVERを使用します ランク、密ランク、行番号、ラグ
結果セットを返します FROM句で使用されます シリーズ生成日

実際的な結果として、集計関数は詳細を省略するのに対し、ウィンドウ関数は詳細を保持します。各従業員とその所属部署の平均値を求めるにはウィンドウ関数が必要です。なぜなら、GROUP BY句では個々の行が完全に削除されてしまうからです。

コマンドと SAP HANA関数の例

以下のステートメントは、SQLコンソールに直接貼り付けることができます。それぞれが、上記のリストから1つのカテゴリを示しています。

1) 文字列関数。 これらは文字入力を受け取り、派生値を返します。

SELECT
  UPPER('sap hana')               AS UPPER_TEXT,
  LENGTH('SAP HANA')              AS TEXT_LENGTH,
  CONCAT('SAP ', 'HANA')         AS JOINED,
  SUBSTRING('SAP HANA', 5, 4)   AS PART,
  REPLACE('SAP HANA', 'HANA', 'S/4') AS SWAPPED,
  TRIM('  padded  ')             AS CLEANED
FROM DUMMY;

2) 数値関数 丸め動作はテストする価値があります。なぜなら、ROUND 関数は市販の丸め機能を使用するのに対し、FLOOR 関数と CEIL 関数は常に一方向に丸められるからです。

SELECT
  ABS(-45.7)          AS ABSOLUTE_VALUE,
  ROUND(123.4567, 2) AS ROUNDED,
  FLOOR(9.9)          AS ROUNDED_DOWN,
  CEIL(9.1)           AS ROUNDED_UP,
  POWER(2, 10)       AS RAISED,
  MOD(17, 5)         AS REMAINDER
FROM DUMMY;

3) 日付と時刻の機能。 これらは、期間報告において最も頻繁に必要とされるものです。

SELECT
  CURRENT_DATE                              AS TODAY,
  ADD_DAYS(CURRENT_DATE, 30)                AS IN_30_DAYS,
  ADD_MONTHS(CURRENT_DATE, -1)              AS LAST_MONTH,
  DAYS_BETWEEN('2026-01-01', CURRENT_DATE) AS ELAPSED,
  LAST_DAY(CURRENT_DATE)                    AS MONTH_END,
  WEEKDAY(CURRENT_DATE)                     AS DAY_INDEX
FROM DUMMY;

4) 変換関数。 明示的な型変換は、WHERE句の処理速度を低下させる暗黙的な型強制を防ぎます。

SELECT
  CAST('1234' AS INTEGER)               AS AS_NUMBER,
  TO_VARCHAR(CURRENT_DATE, 'DD.MM.YYYY') AS AS_TEXT,
  TO_DECIMAL(1234.5678, 10, 2)         AS AS_DECIMAL
FROM DUMMY;

各ターゲット型の型動作と制限については、以下で説明します。 SAP HANAデータ型.

ウィンドウ関数について解説

ウィンドウ関数は、現在の行に関連する一連の行に対して、それらを統合することなく計算を実行します。OVER句はそのセットを定義し、2つのオプション部分があります。PARTITION BYはデータをグループに分割し、ORDER BYは各グループ内の順序を固定します。

SELECT
  DEPARTMENT,
  EMP_NAME,
  SALARY,
  ROW_NUMBER() OVER (PARTITION BY DEPARTMENT ORDER BY SALARY DESC) AS ROW_NUM,
  RANK()       OVER (PARTITION BY DEPARTMENT ORDER BY SALARY DESC) AS RANKING,
  DENSE_RANK() OVER (PARTITION BY DEPARTMENT ORDER BY SALARY DESC) AS DENSE_RANKING,
  SUM(SALARY)  OVER (PARTITION BY DEPARTMENT) AS DEPT_TOTAL
FROM DHK_SCHEMA.EMPLOYEE;

3つのランキング関数は、値が同点の場合にのみ異なる。

  • 行番号 同点になることはありません。給与が全く同じ2人でも、1位と2位がそれぞれ恣意的に選ばれます。
  • RANK 同数の行には同じ番号を割り当て、その後1行飛ばします。1の行が2つある場合は、3が続きます。
  • DENSE_RANK 同数の行には同じ番号が付けられ、番号は飛ばされません。番号が1の行が2つある場合は、その後に2が続きます。

重複排除には ROW_NUMBER を、競技形式の順位付けには RANK を、シーケンスを途切れさせたくない場合は DENSE_RANK を使用します。これらの関数と併用される比較および論理記号については、 SAP HANAオペレーター、およびステートメント構造 SAP HANASQL について.

よくあるご質問

DUMMYは、正確に1行のみを含むシステムテーブルです。これにより、SELECT文で式や関数を実際のテーブルを参照することなく評価できます。

どちらの方法も、同順位の行には同じ番号を割り当てます。RANK では次の値がスキップされるため、1 位が 2 つある場合は 3 位が続きます。DENSE_RANK ではスキップされないため、1 位が 2 つある場合は 2 位が続きます。

はい。変換内容を平易な言葉で記述すれば、対応する関数と構文が返されるので、数百件のエントリからなる参照リストをスキャンするよりも速いです。

よくあることです。フィルタリングされた列を関数で囲むと、効率的なフィルタリングが妨げられます。AI は述語を再構成して、列が変更されないようにすることができます。実行プランで確認してください。

はい、しかしそれを列に適用すると、すべての行で評価が必要になります。可能な限り定数を変換することで、列を効率的にフィルタリングできるようになります。