OceanBaseデータベースに組み込まれている関数は、SQLステートメント内で直接使用できます。各関数の引数に渡される値には期待されるデータ型があります。渡されたデータ型が期待されるものではない場合、OceanBaseデータベースはSQL関数を実際に実行する前に、引数として渡された値を期待されるデータ型に変換しようと試みます。
関数は演算子に似ており、いくつかのデータ要素をパラメータとして入力し、結果を返します。しかし、関数は引数の形式において演算子とは大きく異なります。関数は含めることができるパラメータの数が不定であり、1つから2つ、あるいはそれ以上のパラメータを持つ関数も存在します。
関数名(パラメータ, パラメータ, ...)
関数はパラメータを一切持たない場合もあり、これは疑似列に似ています。ただし、疑似列は通常、結果セット内の各行に対して異なる値を返しますが、変数を持たない関数は通常、各行に対して同じ値を返します。
注意
SQLステートメントで LOB 列に関数を使用する場合、OceanBaseデータベースはSQLおよびPL処理中に一時的な LOB 列を作成し、一定の制限があります。詳細については、Oracleとの互換性比較を参照してください。
本章では、関数を2つの大きなカテゴリに分類しています。各カテゴリの関数のパラメータと最終的な戻り値には、それぞれ特定のデータ型があります:
単一行関数:数値関数、文字列を返す文字列関数、数値を返す文字列関数、日付時刻関数、汎用的な比較関数、変換関数、エンコード・デコード関数、NULL値関連関数、環境・識別関数、階層関数などが含まれます。
集計関数:集約関数と分析関数が含まれます。
単一行関数は、クエリ対象のテーブルまたはビューの各行に対して結果値を返します。これらの関数は、SQLステートメントの SELECT、WHERE、START WITH、CONNECT BY、HAVING 句などで使用できます。
分析関数と集約関数はどちらも、行セットグループ(一連の行の集合)に対して集計計算を行います。違いは、集約関数は各グループごとに1つの値(1行)しか返せないのに対し、分析関数は各グループごとに複数の値(複数行)を返せる点です。行セットグループはウィンドウ(Window)とも呼ばれます。集約関数は通常、SELECT ステートメントの GROUP BY 句と共に使用されます。使用時、データベースはクエリ対象のテーブルまたはビューの行をいくつかのグループに分割し、集約関数を各グループの行に適用し、各グループごとに1つの結果行を返します。
分析関数を使用する際は、特殊なキーワード OVER を使用してウィンドウを指定する必要があります。ウィンドウ関数の詳細については、分析関数の説明を参照してください。
算術演算子
算術演算子の両辺ともに数値型でなければなりません。ほとんどの算術演算子の戻り値は NUMBER 型であり、小数点以下38桁まで表現できます。一部の高次代数関連の関数 COS()、COSH()、EXP()、LN()、LOG()、SIN()、SINH()、SQRT()、TAN()、TANH() の結果は小数点以下36桁まで正確です。その他の代数関連の関数 ACOS()、ASIN()、ATAN()、ATAN2() の結果は小数点以下30桁まで正確です。
関数名 |
機能の説明 |
|---|---|
| ABS | 指定された数値式の絶対値を返します |
| ACOS | 弧度で表された、コサインが指定された数値式となる角を返します |
| ASIN | 弧度で表された、サインが指定された数値式となる角を返します |
| ATAN | 弧度で表された、タンジェントが指定された数値式となる角を返します |
| ATAN2 | 弧度で表された、タンジェントが指定された2つの数値式の比となる角を返します |
| BITAND | 2つの数値に対してビット単位のAND演算を行います |
| CEIL | 指定された数値以上の最小の整数を返します |
| COS | 指定された角度のコサイン値を返します |
| COSH | 指定された角度の双曲コサイン値を返します |
| EXP | eの指定されたべき乗を返します |
| FLOOR | 指定された数値以下の最大の整数を返します |
| GENERATOR | 指定された範囲内の乱数を生成します |
| LN | 指定された数値の自然対数を返します |
| LOG | 指定された数値の対数を返します |
| MOD | 2つの数値を除算したときの剰余を返します |
| NANVL | 最初のパラメータがNaNの場合、2番目のパラメータを返します |
| NORMAL | 正規分布の乱数を生成します |
| POWER | 指定された数値の指定されたべき乗を返します |
| RANDOM | 0から1の間の乱数を生成します |
| RANDSTR | 指定された長さのランダム文字列を生成します |
| REMAINDER | 2つの数値を除算したときの剰余を返します |
| ROUND | 数値を指定された小数点以下の桁数に四捨五入します |
| SIGN | 数値の符号(-1、0、または1)を返します |
| SIN | 指定された角度のサイン値を返します |
| SINH | 指定された角度の双曲サイン値を返します |
| SQRT | 指定された数値の平方根を返します |
| TAN | 指定された角度のタンジェント値を返します |
| TANH | 指定された角度の双曲タンジェント値を返します |
| TRUNC | 数値を指定された小数点以下の桁数まで切り捨てます |
| UNIFORM | 指定された範囲内の一様分布の乱数を生成します |
| WIDTH_BUCKET | 数値を指定された数のバケットに割り当てます |
| ZIPF | ジップフ分布の乱数を生成します |
文字列を返す文字列関数
関数の戻り値の最大長はデータ型の影響を受けます。例えば、関数の戻り値のデータ型が VARCHAR2 である場合、戻り値の実際のサイズが VARCHAR2 データ型の最大制限を超えた場合、OceanBaseデータベースは結果を切り捨てて返しますが、クライアント側ではその旨のメッセージは表示されません。
注意
戻り値のデータ型が CLOB の場合、戻り値の長さが最大制限を超えたとき、OceanBaseデータベースはデータを返さず、エラーメッセージを表示します。
関数名 |
機能の説明 |
|---|---|
| CHR | ASCII値を文字に変換します |
| CONCAT | 2つの文字列を結合します |
| INITCAP | 文字列内の各単語の先頭文字を大文字に変換します |
| LOWER | 文字列を小文字に変換します |
| LPAD | 文字列の左側に指定された文字を埋めます |
| LTRIM | 文字列の左側の空白または指定された文字を削除します |
| NLS_LOWER | 指定された言語環境を使用して、文字列を小文字に変換します |
| NLS_UPPER | 指定された言語環境を使用して、文字列を大文字に変換します |
| NLSSORT | 文字列のソートキーを返します |
| REGEXP_REPLACE | 正規表現を使用して文字列を置き換えます |
| REGEXP_SUBSTR | 正規表現を使用して部分文字列を抽出します |
| REPLACE | 文字列内の部分文字列を置き換えます |
| RPAD | 文字列の右側に指定された文字を埋めます |
| RTRIM | 文字列の右側の空白または指定された文字を削除します |
| SUBSTR | 文字列から部分文字列を抽出します |
| TRIM | 文字列の両端の空白または指定された文字を削除します |
| TRANSLATE | 文字列内の文字を他の文字に置き換えます |
| UPPER | 文字列を大文字に変換します |
数字を返す文字列関数
数字を返す文字列関数は、ASCIIコード値や文字(文字列)の位置など、指定された条件に基づいて数字を返します。
関数名 |
機能の説明 |
|---|---|
| ASCII | 文字列の最初の文字のASCII値を返します |
| INSTR | 文字列内でのサブ文字列の位置を返します |
| LENGTH | 文字列の長さを返します |
| REGEXP_COUNT | 正規表現が文字列にマッチする回数を返します |
| REGEXP_INSTR | 正規表現がマッチする位置を返します |
日付時刻関数
日付時刻関数がサポートする入力パラメータのデータ型は3種類あります。これには、日付時刻 (DATE)、タイムスタンプ (TIMESTAMP、TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE)、および間隔 (INTERVAL DAY TO SECOND、INTERVAL YEAR TO MONTH) が含まれます。
DATE データ型のみを入力パラメータとしてサポートする関数は、ADD_MONTHS、CURRENT_DATE, LAST_DAY、および NEXT_DAY です。
上記の関数に TIMESTAMP 型のデータを指定しようとした場合、OceanBaseデータベースは内部で暗黙的なデータ型変換を行った後、関数に渡して計算を実行し、DATE 型の戻り値を返します。
日付時刻関数を使用する前に、SELECT * FROM NLS_DATABASE_PARAMETERS を実行して現在のNLSフォーマットを確認することをお勧めします。例は以下のとおりです:
obclient> SELECT * FROM NLS_DATABASE_PARAMETERS;
+-------------------------+------------------------------+
| PARAMETER | VALUE |
+-------------------------+------------------------------+
| NLS_DATE_FORMAT | DD-MON-RR |
| NLS_TIMESTAMP_FORMAT | YYYY-MM-DD HH24:MI:SS |
| NLS_TIMESTAMP_TZ_FORMAT | DD-MON-RR HH.MI.SSXFF AM TZR |
| NLS_TERRITORY | AMERICA |
| NLS_SORT | BINARY |
| NLS_COMP | BINARY |
| NLS_CHARACTERSET | AL32UTF8 |
| NLS_NCHAR_CHARACTERSET | AL16UTF16 |
| NLS_DATE_LANGUAGE | AMERICAN |
| NLS_LENGTH_SEMANTICS | BYTE |
| NLS_NCHAR_CONV_EXCP | FALSE |
| NLS_CALENDAR | GREGORIAN |
| NLS_NUMERIC_CHARACTERS | ., |
+-------------------------+------------------------------+
13 rows in set
本文中の例と表示形式が一致しない場合は、以下のコマンドを実行してフォーマットを変更できます:
obclient>ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
Query OK, 0 rows affected
obclient>ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
Query OK, 0 rows affected
/*戻り値の秒の小数部を9桁に設定する*/
obclient> ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF TZR TZD';
Query OK, 0 rows affected
注意
MONTHS_BETWEENの戻り値は1つの数字です。ROUNDとTRUNCは暗黙的な変換を行えません。DATE型の値を渡す必要があります。そうでない場合、エラーが発生します。
残りの関数は、3種類のパラメータデータ型をすべてサポートしており、戻り値も入力パラメータと同じデータ型になります。
関数名 |
機能の説明 |
|---|---|
| ADD_MONTHS | 日付に指定された月数を加算します |
| CURRENT_DATE | 現在の日付を返します |
| CURRENT_TIMESTAMP | 現在の日付と時刻を返します |
| DBTIMEZONE | データベースのタイムゾーンを返します |
| EXTRACT | 日付時刻から指定された部分を抽出します |
| FROM_TZ | タイムスタンプとタイムゾーンをタイムゾーン付きのタイムスタンプに変換します |
| LAST_DAY | 指定された日が含まれる月の最終日を返します |
| LOCALTIMESTAMP | 現在のローカルタイムスタンプを返します |
| MONTHS_BETWEEN | 2つの日付間の月数の差を返します |
| NEXT_DAY | 指定された日の翌日の、指定された曜日の日付を返します |
| NUMTODSINTERVAL | 数値を日から秒の間隔に変換します |
| NUMTOYMINTERVAL | 数値を年から月の間隔に変換します |
| ROUND | 日付を指定された形式に四捨五入します |
| SESSIONTIMEZONE | 現在のセッションのタイムゾーンを返します |
| SYSDATE | 現在のシステム日付と時刻を返します |
| SYSTIMESTAMP | 現在のシステムタイムスタンプを返します |
| SYS_EXTRACT_UTC | タイムゾーン付きのタイムスタンプからUTC時間を抽出します |
| TO_CHAR | 日付時刻を文字列に変換します |
| TO_DSINTERVAL | 文字列を日から秒の間隔に変換します |
| TO_TIMESTAMP | 文字列をタイムスタンプに変換します |
| TO_TIMESTAMP_TZ | 文字列をタイムゾーン付きのタイムスタンプに変換します |
| TO_YMINTERVAL | 文字列を年から月の間隔に変換します |
| TRUNC | 日付を指定された形式に切り捨てます |
| TZ_OFFSET | 指定されたタイムゾーンのオフセット量を返します |
比較関数
このカテゴリの関数を使用すると、コレクション内で最大値や最小値をすばやく見つけることができます。
関数名 |
機能の説明 |
|---|---|
| GREATEST | パラメータリスト内の最大値を返します。 |
| LEAST | パラメータリスト内の最小値を返します。 |
変換関数
このタイプの関数を使用すると、元のデータ型を別のデータ型に変換できます。
関数名 |
機能の説明 |
|---|---|
| ASCIISTR | 文字列をASCII文字列に変換します |
| CAST | 式を指定されたデータ型に変換します |
| CHARTOROWID | 文字列をROWIDに変換します |
| CONVERT | 文字列をある文字セットから別の文字セットに変換します |
| HEXTORAW | 16進数文字列をRAWデータに変換します |
| RAWTOHEX | RAWデータを16進数文字列に変換します |
| ROWIDTOCHAR | ROWIDを文字列に変換します |
| ROWIDTONCHAR | ROWIDをNCHAR文字列に変換します |
| SCN_TO_TIMESTAMP | SCNをタイムスタンプに変換します |
| TIMESTAMP_TO_SCN | タイムスタンプをSCNに変換します |
| TO_BINARY_DOUBLE | 式をBINARY_DOUBLEに変換します |
| TO_BINARY_FLOAT | 式をBINARY_FLOATに変換します |
| TO_BLOB | 式をBLOBに変換します |
| TO_CHAR | 式を文字列に変換します |
| TO_CLOB | 式をCLOBに変換します |
| TO_DATE | 文字列を日付に変換します |
| TO_MULTI_BYTE | 単一字節文字を複数字節文字に変換します |
| TO_NCHAR | 式をNCHAR文字列に変換します |
| TO_NUMBER | 式を数値に変換します |
| TO_SINGLE_BYTE | 複数字節文字を単一字節文字に変換します |
| TO_YMINTERVAL | 文字列を年-月間隔に変換します |
| TO_DSINTERVAL | 文字列を日-秒間隔に変換します |
| TO_TIMESTAMP | 文字列をタイムスタンプに変換します |
| TO_TIMESTAMP_TZ | 文字列をタイムゾーン付きタイムスタンプに変換します |
| UNISTR | 文字列をUnicode文字列に変換します |
エンコード・デコード関数
このタイプの関数を使用すると、OceanBaseデータベースでデータのエンコードおよびデコード要件を実現できます。
関数名 |
機能の説明 |
|---|---|
| DECODE | 条件式。CASEステートメントに似ています。 |
| DUMP | 式の内部表現を返します。 |
| ORA_HASH | 式のハッシュ値を計算します。 |
| VSIZE | 式の内部表現のバイト数を返します。 |
NULL値関連関数
NULL値関連関数は、パラメータ内のNULL値を処理するために使用されます。ほとんどの関数では、入力パラメータがNULL値の場合、戻り値もNULL値になります。このような場合、NVL 関数を使用して、NULL以外の値を返すことができます。例えば、手数料を記録するテーブルの手数料列 commission_pct がNULL値の場合、式 NVL(commission_pct, 0) は0を返します。commission_pct の値がNULLではない場合は、実際の手数料値を返します。
関数名 |
機能の説明 |
|---|---|
| COALESCE | 最初のNULLでない値を返します |
| LNNVL | 条件がNULLまたはFALSEであるかどうかをチェックします |
| NANVL | 最初のパラメータがNaNの場合、2番目のパラメータを返します |
| NULLIF | 2つのパラメータが等しい場合、NULLを返します |
| NVL | 最初のパラメータがNULLの場合、2番目のパラメータを返します |
| NVL2 | 最初のパラメータがNULLでない場合、2番目のパラメータを返します。NULLの場合は3番目のパラメータを返します |
環境関連関数
環境関連関数は、主にセッションまたはテナントインスタンスに関連する環境情報を提供します。
関数名 |
機能の説明 |
|---|---|
| OB_VERSION | OceanBaseデータベースのバージョンを返します |
| SYS_CONTEXT | 指定されたコンテキストのプロパティ値を返します |
| SYS_GUID | グローバル一意の識別子を生成します |
| UID | 現在のユーザーのユーザーIDを返します |
| USER | 現在のユーザー名を返します |
| USERENV | 現在のセッションの環境情報を返します |
階層関数
関数名 |
機能の説明 |
|---|---|
| SYS_CONNECT_BY_PATH | ルートノードから各ノードへの列値のパスを返します。CONNECT BY 条件で返される各行の列値は、指定された区切り文字で区切られます。 |
JSON関数
JSON関数は、JSON値の作成、操作、検索などを行います。
関数名 |
機能の説明 |
|---|---|
| JSON_ARRAY | JSON配列を作成します |
| JSON_ARRAYAGG | 複数行をJSON配列に集約します |
| JSON_EQUAL | 2つのJSON値が等しいかどうかを比較します |
| JSON_EXISTS | JSONドキュメント内に指定されたパスが存在するかどうかを確認します |
| JSON_MERGEPATCH | JSONマージパッチを使用してドキュメントをマージします |
| JSON_OBJECT | JSONオブジェクトを作成します |
| JSON_OBJECTAGG | 複数行をJSONオブジェクトに集約します |
| JSON_QUERY | JSONドキュメントから値を照会します |
| JSON_TABLE | JSONデータをテーブル形式に変換します |
| JSON_VALUE | JSONドキュメントからスカラー値を抽出します |
XML関数
XML関数は、XMLドキュメントの効率的なクエリ、更新、検索を行うことができます。
関数名 |
機能の説明 |
|---|---|
| DELETEXML | XMLドキュメントからノードを削除します |
| EXISTSNODE | XMLドキュメント内に指定されたノードが存在するかどうかを確認します |
| EXTRACT | XMLドキュメントからノードを抽出します |
| EXTRACTVALUE | XMLドキュメントから値を抽出します |
| INSERTCHILDXML | XMLドキュメントに子ノードを挿入します |
| UPDATEXML | XMLドキュメント内のノードを更新します |
| XMLAGG | 複数のXML値を単一のXMLドキュメントに集約します |
| XMLATTRIBUTES | XML属性を作成します |
| XMLCAST | XML値を指定されたデータ型に変換します |
| XMLCONCAT | 複数のXML値を連結します |
| XMLELEMENT | XML要素を作成します |
| XMLFOREST | XMLフォレストを作成します |
| XMLPARSE | 文字列をXMLドキュメントとして解析します |
| XMLSEQUENCE | XMLドキュメントを行シーケンスに変換します |
| XMLSERIALIZE | XMLドキュメントを文字列にシリアライズします |
| XMLTABLE | XMLデータをテーブル形式に変換します |
集計関数
集計関数は、一連の値に対して計算を実行し、単一の値を返します。集計関数はNULL値を無視します。集計関数は、SELECT ステートメントの GROUP BY 句と共によく使用されます。
関数名 |
機能の説明 |
|---|---|
| APPROX_COUNT_DISTINCT | 近似一意値の数を返します |
| AVG | 数値の平均値を返します |
| CORR | 2つの数値列の相関係数を返します |
| COUNT | 行数またはNULL以外の値の数を返します |
| COVAR_POP | 全体分散を返します |
| COVAR_SAMP | サンプル分散を返します |
| CUME_DIST | 累積分布値を返します |
| DENSE_RANK | 密集ランキングを返します |
| GROUP_ID | グループIDを返します |
| GROUPING | GROUP BY句のグループ情報を返します |
| GROUPING_ID | グループIDのビットベクトルを返します |
| KEEP | グループ内で指定条件の値を保持します |
| LISTAGG | 複数行の値を1つの文字列に結合します |
| MAX | 最大値を返します |
| MEDIAN | 中央値を返します |
| MIN | 最小値を返します |
| PERCENTILE_CONT | 線形パーセンタイル値を返します |
| PERCENTILE_DISC | 離散パーセンタイル値を返します |
| PERCENT_RANK | パーセンタイルランキングを返します |
| RANK | ランキングを返します |
| REGR_ | 線形回帰関数ファミリー |
| ROLLUP | グループ集計を作成します |
| STDDEV | 標準偏差を返します |
| STDDEV_POP | 全体標準偏差を返します |
| STDDEV_SAMP | サンプル標準偏差を返します |
| SUM | 数値の合計を返します |
| VAR_POP | 全体分散を返します |
| VAR_SAMP | サンプル分散を返します |
| VARIANCE | 分散を返します |
| WMSYS.WM_CONCAT/WM_CONCAT | 複数行の値を1つの文字列に結合します |
分析関数
分析関数(一部のデータベースではウィンドウ関数とも呼ばれる)は集約関数に似ており、常に一連の行の集合に基づいて計算を行います。違いは、集約関数が一つのグループから一行しか返せないのに対し、分析関数は一つのグループから複数行を返すことができ、グループ内の各行はウィンドウの論理に基づいた計算結果であるという点です。分析関数は、自己結合を必要とするクエリを大幅に最適化できます。
関数名 |
機能の説明 |
|---|---|
| ARG_MAX | 最大値を返すパラメータ |
| ARG_MIN | 最小値を返すパラメータ |
| AVG | 数値の平均値を返す |
| CORR | 2つの数値列の相関係数を返す |
| COUNT | 行数またはNULLでない値の数を返す |
| COVAR_POP | 全体の共分散を返す |
| COVAR_SAMP | サンプルの共分散を返す |
| CUME_DIST | 累積分布値を返す |
| DENSE_RANK | 密集ランキングを返す |
| FIRST_VALUE | ウィンドウ内の最初の値を返す |
| KEEP | グループ内で指定条件の値を保持する |
| LAG | 前の1行またはN行の値を返す |
| LAST_VALUE | ウィンドウ内の最後の値を返す |
| LEAD | 次の1行またはN行の値を返す |
| LISTAGG | 複数行の値を1つの文字列に結合する |
| MAX | 最大値を返す |
| MEDIAN | 中央値を返す |
| MIN | 最小値を返す |
| NTH_VALUE | ウィンドウ内のN番目の値を返す |
| NTILE | 結果セットを指定された数のグループに分割する |
| PERCENTILE_CONT | 連続パーセンタイル値を返す |
| PERCENTILE_DISC | 疎散パーセンタイル値を返す |
| PERCENT_RANK | パーセンタイルランキングを返す |
| RANK | ランキングを返す |
| RATIO_TO_REPORT | グループ内の値の割合を返す |
| REGR_ | 線形回帰関数ファミリー |
| ROW_NUMBER | 行番号を返す |
| STDDEV | 標準偏差を返す |
| STDDEV_POP | 全体の標準偏差を返す |
| STDDEV_SAMP | サンプルの標準偏差を返す |
| SUM | 数値の合計を返す |
| VAR_POP | 全体の分散を返す |
| VAR_SAMP | サンプルの分散を返す |
| VARIANCE | 分散を返す |
| WMSYS.WM_CONCAT/WM_CONCAT | 複数行の値を1つの文字列に結合する |
情報関数
関数名 |
機能の説明 |
|---|---|
| OB_TRANSACTION_ID | 現在のトランザクションIDを返します |
空間関数
関数名 |
機能の説明 |
|---|---|
| SDO_GEOMETRY | 空間幾何オブジェクトを作成します |
| クエリ計算関数 | 空間幾何オブジェクトの属性を照会および計算します |