Oracle Database SQL言語リファレンス 11g リリース1(11.1) E05750-03 |
|
ファンクションは、データ項目を操作し、結果を戻すという点で演算子に似ていますが、ファンクションと演算子は引数を指定する書式が異なります。次の書式によって、ファンクションでは0(ゼロ)以上の引数を操作できます。
function(argument, argument, ...)
引数を指定しないファンクションは疑似列に似ています(第3章「疑似列」を参照)。ただし、疑似列は、通常、結果セット内の各行に対して異なる値を戻しますが、引数を指定しないファンクションは、各行に対して同じ値を戻します。
この章では、次の内容を説明します。
SQLファンクションは、Oracle Databaseに組み込まれており、適切なSQL文で使用できます。SQLファンクションと、PL/SQLで記述されたユーザー定義ファンクションを混同しないでください。
SQLファンクションが戻す値のデータ型以外のデータ型の引数でSQLファンクションをコールすると、OracleはSQLファンクションを実行する前に、その引数を必要なデータ型に変換します。
SQLファンクションの構文図では、データ型とともに引数が示されています。SQL構文にパラメータfunction
が指定されている場合は、この項で説明するファンクションの1つに置き換えます。ファンクションは、引数のデータ型および戻り値によってグループ化されています。
参照:
|
次に、ファンクションのカテゴリを表す構文を示します。
次の項に、前述の図のユーザー定義ファンクション以外の各グループにおける組込みSQLファンクションを示します。すべての組込みSQLファンクションを、アルファベット順に説明します。
単一行ファンクションは、問合せ対象の表またはビューの各行に対して1つの結果行を戻します。これらのファンクションは、SELECT構文のリスト、WHERE
句、START
WITH
句、CONNECT
BY
句およびHAVING
句に指定できます。
数値ファンクションは入力として数値を受け取り、結果として数値を戻します。数値ファンクションのほとんどは、38桁(10進)のNUMBER
値を戻します。超越関数(COS
、COSH
、EXP
、LN
、LOG
、SIN
、SINH
、SQRT
、TAN
およびTANH
)は、36桁(10進)の値を戻します。超越関数のACOS
、ASIN
、ATAN
、ATAN2
は、30桁(10進)の値を戻します。数値ファンクションを次に示します。
文字値を戻す文字ファンクションは、特に指定がないかぎり、次のデータ型の値を戻します。
ファンクションによって戻される値の長さは、戻されるデータ型の最大長によって制限されます。
CHAR
またはVARCHAR2
型の値を戻すファンクションの戻り値の長さが制限を超えた場合、Oracle Databaseは戻り値から制限を超えた部分を切り捨てて、エラー・メッセージを表示せずにその結果を戻します。
CLOB
型の値を戻すファンクションの戻り値の長さが制限を超えた場合、Oracleはエラーを表示し、データを戻しません。
文字値を戻す文字ファンクションを次に示します。
NLS文字ファンクションは、キャラクタ・セットの情報を戻します。NLS文字ファンクションを次に示します。
数値を戻す文字ファンクションの引数には、すべての文字データ型を指定できます。
数値を戻す文字ファンクションを次に示します。
日時ファンクションは、日付(DATE
)、タイムスタンプ(TIMESTAMP
、TIMESTAMP
WITH
TIME
ZONE
、TIMESTAMP
WITH
LOCAL
TIME
ZONE
)および期間(INTERVAL
DAY
TO
SECOND
、INTERVAL
YEAR
TO
MONTH
)の値を操作します。
一部の日付ファンクションは、OracleのDATE
データ型(ADD_MONTHS
、CURRENT_DATE
、LAST_DAY
、NEW_TIME
およびNEXT_DAY
)用に設計されています。これらのファンクションの引数にタイムスタンプ値を指定すると、Oracle Databaseは入力された型をDATE
値に内部的に変換し、DATE
値を戻します。ただし、MONTHS_BETWEEN
ファンクションは数値を戻し、ROUND
およびTRUNC
ファンクションはタイムスタンプ値または期間値を受け入れません。
その他の日時ファンクションは、3種類のすべてのデータ型(日付、タイムスタンプ、期間)を受け入れ、それらのいずれかのデータ型の値を戻すように設計されています。
SYSDATE
、SYSTIMESTAMP
、CURRENT_TIMESTAMP
などの、現在のシステム日時情報を戻す日時ファンクションはすべて、SQL文で参照される回数に関係なく、SQL文ごとに1回評価されます。
日時ファンクションを次に示します。
一般的な比較ファンクションは、値の集合から最大値または最小値(あるいはその両方)を決定します。一般的な比較ファンクションを次に示します。
変換ファンクションは、あるデータ型から他のデータ型に値を変換します。一般に、ファンクション名はdatatype
TO
datatype
の書式で指定されます。最初のデータ型は入力データ型です。2番目のデータ型は出力データ型です。SQL変換ファンクションを次に示します。
ラージ・オブジェクト・ファンクションは、LOBを操作します。ラージ・オブジェクト・ファンクションを次に示します。
収集ファンクションは、ネストした表およびVARRAYを操作します。SQL収集ファンクションを次に示します。
階層ファンクションは、階層パス情報を結果セットに適用します。
データ・マイニング・ファンクションは、DBMS_DATA_MINING
パッケージまたはOracle Data Mining Java APIを使用して作成したモデルを操作します。SQLデータ・マイニング・ファンクションを次に示します。
XMLファンクションは、XML文書またはフラグメントを操作または戻します。出力の書式設定など、これらのファンクションを使用したXMLデータの選択および問合せの詳細は、『Oracle XML DB開発者ガイド』を参照してください。SQL XMLファンクションを次に示します。
エンコーディング・ファンクションおよびデコーディング・ファンクションでは、データベース内のデータを調査およびデコードできます。
NULL
関連ファンクションは、NULL処理を簡単にします。NULL
関連ファンクションを次に示します。
環境ファンクションおよび識別子ファンクションは、インスタンスとセッションの情報を提供します。これらのファンクションを次に示します。
集計ファンクションは、単一行に基づく結果行を戻すのではなく、行のグループに基づく単一結果行を戻します。集計ファンクションは、SELECT構文のリスト、ORDER
BY
およびHAVING
句に指定できます。集計ファンクションは、通常、SELECT
文のGROUP
BY
句で使用され、この句の中で問合せ対象の表またはビューの行がグループ化されます。GROUP
BY
句を含む問合せでは、SELECT構文のリストの要素は、集計ファンクション、GROUP
BY
式、定数またはこれらのいずれかを含む式になります。Oracleは、集計ファンクションを行の各グループに適用し、各グループに単一の結果行を戻します。
GROUP
BY
句を指定しないと、SELECT構文のリスト内の集計ファンクションは、問合せ対象の表またはビューのすべての行に適用されます。HAVING
句で集計ファンクションを使用して、グループを出力しないこともできます。このとき、出力は、問合せ対象の表またはビューの各行の値ではなく、集計ファンクションの結果に基づきます。
単一の引数を指定する多くの集計ファンクションには、次の句があります。
たとえば、1、1、1、3の平均値はDISTINCT
では2となり、ALL
では1.5となります。どの句も指定しない場合、デフォルトでALL
が使用されます。
集計ファンクションには、分析ファンクションの構文の一部であるwindowing_clause
を使用できるものがあります。この句の詳細は、「windowing_clause」を参照してください。この項の最後に示す集計ファンクションのリストでは、windowing_clause
を使用できるファンクションにアスタリスク(*)が付いています。
COUNT
(*)、GROUPING
およびGROUPING_ID
を除くすべての集計ファンクションは、NULLを無視します。集計ファンクションに対する引数にNVL
ファンクションを使用して、NULLをある値で置き換えることができます。COUNT
およびREGR_COUNT
はNULLを戻しません。数字または0(ゼロ)を戻します。その他の集計ファンクションでは、データ・セットに行がない場合、または集計ファンクションに対する引数としてNULLを持つ行のみがある場合はNULLを戻します。
集計ファンクションMIN
、MAX
、SUM
、AVG
、COUNT
、VARIANCE
およびSTDDEV
の後に、KEEP
キーワードを指定すると、FIRST
またはLAST
ファンクションと組み合せて使用することができ、与えられたソート指定に対して、FIRST
またはLAST
としてランク付けされた一連の行の一連の値を操作できます。詳細は、「FIRST」を参照してください。
集計ファンクションはネストできます。たとえば、次の例では、サンプル・スキーマhr
のすべての部門における最高額の給与の平均を計算します。
SELECT AVG(MAX(salary)) FROM employees GROUP BY department_id; AVG(MAX(SALARY)) ---------------- 10925
この計算では、GROUP
BY
句(department_id
)で定義されているグループごとの内部集計(MAX
(salary
))を評価し、その結果をもう一度集計しています。
集計ファンクションを次に示します。
分析ファンクションは、行のグループに基づいて集計値を計算します。各グループに対して複数の行を戻す点で、集計ファンクションと異なります。行のグループをウィンドウといい、analytic_clause
で定義されます。各行に対して、行のスライディング・ウィンドウが定義されます。このウィンドウによって、カレント行の計算に使用される行の範囲が決定されます。ウィンドウの大きさは、行の物理数値または時間などのロジカル・インターバルに基づきます。
分析ファンクションは、問合せで最後に実行される演算(最後のORDER
BY
句を除く)の集合です。すべての結合およびすべてのWHERE
、GROUP
BY
およびHAVING
句は、分析ファンクションが処理される前に実行されます。そのため、分析ファンクションは、SELECT構文のリストまたはORDER
BY
句のみに指定できます。
通常、分析ファンクションは、累積集計、移動集計、センター集計およびレポート集計の実行に使用されます。
次に、この構文のセマンティクスを示します。
分析ファンクションの名前を指定します(セマンティクスの説明の後に示す分析ファンクションのリストを参照)。
分析ファンクションには引数を0〜3個指定します。引数には、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を指定できます。Oracleは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換します。個々のファンクションに特に指定がないかぎり、戻り型もその引数のデータ型となります。
OVER
analytic_clause
句は、ファンクションが問合せ結果セットを操作することを示します。この句は、FROM
、WHERE
、GROUP
BY
およびHAVING
句の後に計算されます。SELECT構文のリストのこの句またはORDER
BY
句に分析ファンクションを指定できます。分析ファンクションに基づいて、問合せの結果をフィルタするには、これらのファンクションを親問合せ内でネストした後、ネストされた副問合せの結果をフィルタします。
analytic_clause
には、次の注意事項があります。
analytic_clause
のどの部分にも、分析ファンクションを指定して分析ファンクションをネストできません。ただし、副問合せで分析ファンクションを指定して、別の分析ファンクションを計算することはできます。
OVER
analytic_clause
には、組込み分析ファンクションと同様に、ユーザー定義の分析ファンクションを指定できます。「CREATE FUNCTION」を参照してください。
PARTITION
BY
句を使用すると、1つ以上のvalue_expr
に基づいて、問合せ結果セットをグループに分割できます。この句を省略すると、ファンクションは問合せ結果セットのすべての行を単一のグループとして扱います。
分析ファンクションでquery_partition_clause
を使用するには、構文の上位ブランチ(カッコなし)を使用します。この句をモデルの問合せ(model_column_clauses
内)またはパーティション化された外部結合(outer_join_clause
内)で使用するには、構文の下位ブランチ(カッコ付き)を使用します。
同じまたは異なるPARTITION
BY
キーで、同じ問合せに複数の分析ファンクションを指定できます。
問い合せているオブジェクトにパラレル属性があり、query_partition_clause
で分析ファンクションを指定する場合は、ファンクションの計算もパラレル化されます。
有効な値のvalue_expr
は、定数、列、非分析ファンクション、ファンクション式、またはこれらのいずれかを含む式です。
order_by_clause
を使用すると、パーティション内でのデータの順序付け方法を指定できます。PERCENTILE_CONT
および(単一キーのみを適用する)PERCENTILE_DISC
以外の分析ファンクションでは、各キーがvalue_expr
で定義され、順序付けシーケンスで修飾された複数キーのパーティションの値を順序付けできます。
各ファンクションには、複数の順序式を指定できます。これは、2番目の式が最初の式にある同一値との間の関連性を変換できるため、値をランク付けするファンクションを使用する場合に特に有効です。
order_by_clause
の結果が複数行の個々の値である場合、ファンクションは各行の同じ値を戻します。この動作の詳細は、「SUM」の分析例を参照してください。
ORDER
BY
句には次の制限事項があります。
order_by_clause
を分析ファンクションで使用する場合、式(expr
)が必要です。SIBLINGS
キーワードは無効です(これは、階層問合せでのみ有効です)。位置(position
)および列別名(c_alias
)も無効です。それ以外で使用する場合、このorder_by_clause
は、問合せまたは副問合せ全体を順序付ける場合に使用するものと同じです。
RANGE
キーワードを使用する分析ファンクションでは、次の2つのウィンドウのいずれかを指定する場合に、ORDER
BY
句で複数のソート・キーを使用できます。
RANGE
BETWEEN
UNBOUNDED
PRECEDING
AND
CURRENT
ROW
。この短縮形は、RANGE
UNBOUNDED
PRECEDING
です。
RANGE
BETWEEN
CURRENT
ROW
AND
UNBOUNDED
FOLLOWING
。
この2つ以外のウィンドウ境界では、分析ファンクションのORDER
BY
句でソート・キーを1つしか持てません。この制限事項は、ROW
キーワードで指定したウィンドウ境界には適用されません。
順序付けシーケンス(昇順または降順)を指定します。デフォルトはASC
です。
NULL値を含む戻された行が順序の最初にくるか、最後にくるかを指定します。
NULLS
LAST
は昇順のデフォルトで、NULLS
FIRST
は降順のデフォルトです。
分析ファンクションは、常に、ファンクションのorder_by_clause
で指定された順序で行を操作します。ただし、ファンクションのorder_by_clause
は結果の順序を保証しません。最終結果の順序を保証するには、問合せのorder_by_clause
を使用してください。
一部の分析ファンクションでは、windowing_clause
を使用できます。7-16ページに示す分析ファンクションのリストでは、windowing_clause
を使用できるファンクションにアスタリスク(*)が付いています。
これらのキーワードは、各行に対して、ファンクションの結果の計算に使用されるウィンドウ(行の物理集合または論理集合)を定義します。ファンクションは、ウィンドウのすべての行に適用されます。ウィンドウは、問合せ結果セット内またはパーティションの上から下まで移動します。
order_by_clause
を指定しないと、この句を指定できません。RANGE
句で定義したウィンドウ境界には、order_by_clause
で指定できる式が1つのみのものもあります。詳細は、「ORDER BY句の制限事項:」を参照してください。
分析ファンクションが論理オフセットで戻す値は、常に決定的なものです。ただし、分析ファンクションが物理オフセットで戻す値は、順序式の結果が一意の順序にならないかぎり、非決定的な結果を生成することがあります。order_by_clause
に複数の列を指定して、結果の順序を一意にする必要があります。
BETWEEN
... AND
句を使用すると、ウィンドウにスタート・ポイントおよびエンド・ポイントを指定できます。最初の式(AND
の前)はスタート・ポイントを定義し、2番目の式(AND
の後)はエンド・ポイントを定義します。
BETWEEN
を省略してエンド・ポイントを1つのみ指定すると、Oracleはそれをスタート・ポイントとみなし、デフォルトでカレント行をエンド・ポイントに指定します。
UNBOUNDED
PRECEDING
を指定すると、パーティションの最初の行で、ウィンドウが開始します。これはスタート・ポイントの指定で、エンド・ポイントの指定としては使用できません。
UNBOUNDED
FOLLOWING
を指定すると、パーティションの最後の行で、ウィンドウが終了します。これはエンド・ポイントの指定で、スタート・ポイントの指定としては使用できません。
スタート・ポイントとして、ウィンドウがカレント行または値(それぞれROW
またはRANGE
を指定したかどうかに基づく)で開始することを指定します。この場合、value_expr
PRECEDING
をエンド・ポイントにできません。
エンド・ポイントとして、ウィンドウがカレント行または値(それぞれROW
またはRANGE
を明示的に指定したかどうかに基づく)で終了することを指定します。この場合、value_expr
FOLLOWING
をスタート・ポイントにできません。
RANGE
またはROW
に対して、次のことがいえます。
value_expr
FOLLOWING
がスタート・ポイントの場合、エンド・ポイントはvalue_expr
FOLLOWING
である必要があります。
value_expr
PRECEDING
がエンド・ポイントの場合、スタート・ポイントはvalue_expr
PRECEDING
である必要があります。
数値形式の時間間隔で定義されている論理ウィンドウを定義する場合、変換ファンクションを使用する必要があります。
ROWS
を指定した場合、次のことがいえます。
value_expr
は物理オフセットになります。これは定数または式であり、正数値に評価する必要があります。
value_expr
がスタート・ポイントの一部の場合、エンド・ポイントの前にある行に評価する必要があります。
RANGE
を指定した場合、次のことがいえます。
value_expr
は論理オフセットになります。これは、正数値または期間リテラルに評価する定数または式である必要があります。期間リテラルの詳細は、「リテラル」を参照してください。
order_by_clause
には、式を1つのみ指定できます。
value_expr
が数値に対して評価を行う場合、ORDER
BY
expr
は数値データ型またはDATE
データ型である必要があります。
value_expr
が間隔値に対して評価を行う場合、ORDER
BY
expr
はDATE
データ型である必要があります。
windowing_clause
を完全に省略した場合、デフォルトでRANGE
BETWEEN
UNBOUNDED
PRECEDING
AND
CURRENT
ROW
になります。
分析ファンクションは、通常、データ・ウェアハウス環境で使用されます。次に示す分析ファンクションのリストでは、windowing_clause
を含む完全な構文を使用できるファンクションには、アスタリスク(*)が付いています。
オブジェクト参照ファンクションは、指定されたオブジェクト型のオブジェクトへの参照となるREF値を操作します。オブジェクト参照ファンクションを次に示します。
モデル・ファンクションは、SELECT
文のmodel_clause
でのみ使用できます。新しいモデル・ファンクションを次に示します。
この項では、SQLファンクションをアルファベット順に示し、説明します。
ABS
は、n
の絶対値を戻します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。また、引数の数値データ型と同じデータ型を戻します。
次の例では、-15の絶対値を戻します。
SELECT ABS(-15) "Absolute" FROM DUAL; Absolute ---------- 15
ACOS
は、n
のアーク・コサインを戻します。引数n
は-1〜1の範囲で、ファンクションによって戻される値は0〜π(ラジアン)の範囲です。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。引数がBINARY_FLOAT
の場合、このファンクションはBINARY_DOUBLE
を戻します。それ以外の場合、引数と同じ数値データ型を戻します。
次の例では、.3のアーク・コサインを戻します。
SELECT ACOS(.3)"Arc_Cosine" FROM DUAL; Arc_Cosine ---------- 1.26610367
ADD_MONTHS
は、日付date
に月数integer
を加えて戻します。月は、セッション・パラメータNLS_CALENDAR
によって定義されます。引数dateには、日時値、または暗黙的にDATE
に変換可能な任意の値を指定できます。引数integer
には、整数、または暗黙的に整数に変換可能な任意の値を指定できます。戻り型は、date
のデータ型に関係なく常にDATE
です。date
が月の最終日の場合、または結果の月の日数がdate
の日付コンポーネントよりも少ない場合、戻される値は結果の月の最終日となります。それ以外の場合、結果にはdate
と同じ日付コンポーネントが含まれます。
次の例では、サンプル表employees
のhire_date
後の月を戻します。
SELECT TO_CHAR( ADD_MONTHS(hire_date,1), 'DD-MON-YYYY') "Next month" FROM employees WHERE last_name = 'Baer'; Next Month ----------- 07-JUL-1994
APPENDCHILDXML
は、ユーザー指定の値を、XPath式で指定したノードの子としてターゲットXMLに追加します。
XMLType_instance
は、XMLType
のインスタンスです。
XPath_string
は、1つ以上の子ノードが追加されるノードを1つ以上指定するXPath式です。先頭にスラッシュを付けて絶対XPath_string
を指定したり、先頭のスラッシュを省略して相対XPath_string
を指定できます。先頭のスラッシュを省略した場合、相対パスのコンテキストは、デフォルトでルート・ノードに設定されます。
value_expr
は、XMLType
の1つ以上のノードを指定します。これは文字列に変換する必要があります。
namespace_string
は、XPath_string
のネームスペース情報を提供します。このパラメータは、VARCHAR2
型である必要があります。次の例では、/Building
ノードの値が「Rented」の場合に、/Owner
ノードをoe.warehouses
表のwarehouse_spec
の/Warehouse/Building
ノードに追加します。
UPDATE warehouses SET warehouse_spec = APPENDCHILDXML(warehouse_spec, 'Warehouse/Building', XMLType('<Owner>Grandco</Owner>')) WHERE EXTRACTVALUE(warehouse_spec, '/Warehouse/Building') = 'Rented'; SELECT warehouse_id, warehouse_name, EXTRACTVALUE(warehouse_spec, '/Warehouse/Building/Owner') "Prop.Owner" FROM warehouses WHERE EXISTSNODE(warehouse_spec, '/Warehouse/Building/Owner') = 1; WAREHOUSE_ID WAREHOUSE_NAME Prop.Owner ------------ --------------- ---------- 2 San Francisco Grandco 3 New Jersey Grandco
ASCIISTR
は、任意のキャラクタ・セットの文字列、または文字列に変換する式を引数として取り、データベース・キャラクタ・セットのASCII文字列を戻します。ASCII文字以外は、\xxxx
という書式に変換されます。xxxx
は、UTF-16のコード単位です。
次の例では、テキスト文字列「ABÄCDE
」をASCII文字列で戻します。
SELECT ASCIISTR('ABÄCDE') FROM DUAL; ASCIISTR(' ---------- AB\00C4CDE
ASCII
は、char
の最初の文字の、データベース・キャラクタ・セットでの10進表記を戻します。
char
のデータ型は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
です。戻り値のデータ型はNUMBER
です。データベース・キャラクタ・セットが7ビットのASCIIの場合、このファンクションはASCII値を戻します。データベース・キャラクタ・セットがEBCDICコードの場合、このファンクションはEBCDIC値を戻します。このファンクションと一致するEBCDIC文字ファンクションは存在しません。
このファンクションは、CLOB
データを直接的にサポートしていません。ただし、暗黙的なデータ変換を使用してCLOB
を引数として渡すことはできます。
次の例では、姓が文字「L」で始まり、ASCII表記が76の従業員を戻します。
SELECT last_name FROM employees WHERE ASCII(SUBSTR(last_name, 1, 1,)) = 76; LAST_NAME ------------------------- Ladwig Landry Lee Livingston
ASIN
は、n
のアーク・サインを戻します。引数n
は-1〜1の範囲で、ファンクションによって戻される値は-π/2〜π/2(ラジアン)の範囲です。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。引数がBINARY_FLOAT
の場合、このファンクションはBINARY_DOUBLE
を戻します。それ以外の場合、引数と同じ数値データ型を戻します。
次の例では、.3のアーク・サインを戻します。
SELECT ASIN(.3) "Arc_Sine" FROM DUAL; Arc_Sine ---------- .304692654
ATAN
は、n
のアーク・タンジェントを戻します。引数n
の範囲に制限はなく、ファンクションによって戻される値は-π/2〜π/2(ラジアン)の範囲です。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。引数がBINARY_FLOAT
の場合、このファンクションはBINARY_DOUBLE
を戻します。それ以外の場合、引数と同じ数値データ型を戻します。
次の例では、.3のアーク・タンジェントを戻します。
SELECT ATAN(.3) "Arc_Tangent" FROM DUAL; Arc_Tangent ---------- .291456794
ATAN2
は、n1
およびn2
のアーク・タンジェントを戻します。引数n1
の範囲に制限はなく、n1
とn2
の符号により、ファンクションによって戻される値は-π〜π(ラジアン)の範囲です。ATAN2
(n1,n2
)と、ATAN
(n1/n2
)は同じです。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。いずれかの引数がBINARY_FLOAT
またはBINARY_DOUBLE
の場合、このファンクションはBINARY_DOUBLE
を戻します。それ以外の場合、NUMBER
を戻します。
次の例では、.3および.2のアーク・タンジェントを戻します。
SELECT ATAN2(.3, .2) "Arc_Tangent2" FROM DUAL; Arc_Tangent2 ------------ .982793723
AVG
は、expr
の平均値を戻します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。また、引数の数値データ型と同じデータ型を戻します。
DISTINCT
を指定する場合は、analytic_clause
のquery_partition_clause
のみ指定できます。order_by_clause
およびwindowing_clause
は指定できません。
次の例では、hr.employees
表にあるすべての従業員の平均給与を計算します。
SELECT AVG(salary) "Average" FROM employees; Average -------------- 6461.68224
次の例では、employees
表の各従業員について、ある期間内に雇用された従業員の平均給与を所属別に計算します。
SELECT manager_id, last_name, hire_date, salary, AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS c_mavg FROM employees ORDER BY manager_id, last_name, hire_date, salary, AVG(salary); MANAGER_ID LAST_NAME HIRE_DATE SALARY C_MAVG ---------- ------------------------- --------- ---------- ---------- 100 Kochhar 21-SEP-89 17000 17000 100 De Haan 13-JAN-93 17000 15000 100 Raphaely 07-DEC-94 11000 11966.6667 100 Kaufling 01-MAY-95 7900 10633.3333 100 Hartstein 17-FEB-96 13000 9633.33333 100 Weiss 18-JUL-96 8000 11666.6667 100 Russell 01-OCT-96 14000 11833.3333 100 Partners 05-JAN-97 13500 13166.6667 . . .
BFILENAME
は、サーバーのファイル・システムの物理LOBバイナリ・ファイルに対応付けられているBFILE
ロケータを戻します。
directory
'は、実際にファイルが存在するサーバーのファイル・システム上のフルパス名に対する別名となるデータベース・オブジェクトです。
filename
'は、サーバーのファイル・システムにあるファイルの名前です。
SQL文、PL/SQL文、DBMS_LOB
パッケージまたはOCIの操作で、これらをBFILENAME
への引数として使用するには、まずディレクトリ・オブジェクトを作成し、BFILE
値を物理ファイルと対応付ける必要があります。
次の2つの方法で、このファンクションを使用できます。
ディレクトリの引数の大/小文字は区別されます。データ・ディクショナリ内に存在する名前と同じ名前でディレクトリ・オブジェクト名を指定しているかを確認する必要があります。たとえば、CREATE
DIRECTORY
文で、大/小文字を組み合せた識別子を引用符で囲んで使用してAdmin
ディレクトリ・オブジェクトを作成すると、BFILENAME
ファンクションを使用する場合、ディレクトリ・オブジェクトを'Admin'
として指定する必要があります。filename引数は、ご使用のオペレーティング・システムの大/小文字および記号の表記規則に従って指定する必要があります。
参照:
|
次の例では、サンプル表pm.print_media
に行を挿入します。BFILENAME
を使用して、$ORACLE_HOME/demo/schema/product_media
ディレクトリにある、サーバーのファイル・システムのバイナリ・ファイルを識別します。次の例では、PMスキーマでのディレクトリのデータベース・オブジェクトmedia_dir
の作成方法を示します。
CREATE DIRECTORY media_dir AS '/demo/schema/product_media'; INSERT INTO print_media (product_id, ad_id, ad_graphic) VALUES (3000, 31001, BFILENAME('MEDIA_DIR', 'modem_comp_ad.gif'));
BIN_TO_NUM
は、ビット・ベクトルを同等の数値に変換します。このファンクションの各引数は、ビット・ベクトルのビットを表します。このファンクションは、引数として、任意の数値データ型、または暗黙的にNUMBER
に変換可能な数値以外のデータ型を取ります。各expr
は、0または1に評価される必要があります。このファンクションはOracleのNUMBER
値を戻します。
BIN_TO_NUM
は、データ・ウェアハウスのアプリケーションで、グルーピング・セットを使用して、マテリアライズド・ビューから対象グループを検索する場合に有効です。
参照:
|
次の例では、バイナリの値を数値に変換します。
SELECT BIN_TO_NUM(1,0,1,0) FROM DUAL; BIN_TO_NUM(1,0,1,0) ------------------- 10
次の例では、3つの値を1つのバイナリの値に変換し、BIN_TO_NUM
を使用してこのバイナリを数値に変換します。この例では、PL/SQL宣言を使用して元の値を指定します。これらの値は、通常は実際のデータ・ソースから導出されます。
SELECT order_status FROM orders WHERE order_id = 2441; ORDER_STATUS ------------ 5 DECLARE warehouse NUMBER := 1; ground NUMBER := 1; insured NUMBER := 1; result NUMBER; BEGIN SELECT BIN_TO_NUM(warehouse, ground, insured) INTO result FROM DUAL; UPDATE orders SET order_status = result WHERE order_id = 2441; end; / PL/SQL procedure successfully completed. SELECT order_status FROM orders WHERE order_id = 2441; ORDER_STATUS ------------ 7
この逆の(1つの列値から複数の値を抽出する)プロセスの詳細は、「BITAND」の例を参照してください。
BITAND
ファンクションは、その入力と出力をビットのベクトルとして扱います。出力は、入力のビット単位AND
になります。
expr1
およびexpr2
の型はNUMBER
であり、結果はNUMBER
型になります。BITAND
のいずれかの引数がNULL
の場合、結果はNULL
になります。
引数は、-(2(n-1)) .. ((2(n-1))-1)の範囲にする必要があります。引数をこの範囲外にすると、結果は未定義になります。
結果は、いくつかのステップで計算されます。まず、それぞれの引数Aが値SIGN(A)*FLOOR(ABS(A))
に置き換えられます。この変換では、各引数の小数点以下が切り捨てられます。次に、整数値となったそれぞれの引数Aが、nビットの2の補数のバイナリ整数値に変換されます。ビット単位AND
演算を使用して、2つのビット値が組み合せられます。最後に、生成されたnビットの2の補数値がNUMBER
に変換されます。
BITAND
の現行の実装では、n
= 128が定義されています。
BINARY_INTEGER
で、n
= 32のBITAND
のオーバーロードをサポートしています。
次の例では、数値6(バイナリ1,1,0)と数値3(バイナリ0,1,1)にAND
演算を実行します。
SELECT BITAND(6,3) FROM DUAL; BITAND(6,3) ----------- 2
これは、6と3のバイナリの値を示す次の例と同じです。BITAND
ファンクションは、バイナリの値の有効桁のみで演算を実行します。
SELECT BITAND( BIN_TO_NUM(1,1,0), BIN_TO_NUM(0,1,1)) "Binary" FROM DUAL; Binary ---------- 2
単一の列値における複数の値のエンコードの詳細は、「BIN_TO_NUM」の例を参照してください。
次の例では、サンプル表oe.orders
のorder_status
列で複数の選択項目を1つの数値内の個別のビットとしてエンコードします。たとえば、まだ倉庫にある発注は、バイナリの値001(10進値1)で表されます。陸上輸送で発送される発注は、バイナリの値010(10進値2)で表されます。保険がかけられた荷物は、バイナリの値100(10進値4)で表されます。この例では、DECODE
ファンクションを使用して、order_status
値の3つのビットのそれぞれに2つの値(ビットがオンの場合の値とビットがオフの場合の値)が示されています。
SELECT order_id, customer_id, order_status, DECODE(BITAND(order_status, 1), 1, 'Warehouse', 'PostOffice') "Location", DECODE(BITAND(order_status, 2), 2, 'Ground', 'Air') "Method", DECODE(BITAND(order_status, 4), 4, 'Insured', 'Certified') "Receipt" FROM orders WHERE sales_rep_id = 160 ORDER BY order_id; ORDER_ID CUSTOMER_ID ORDER_STATUS Location Method Receipt ---------- ----------- ------------ ---------- ------ --------- 2455 145 7 Warehouse Ground Insured 2416 104 6 PostOffice Ground Insured 2419 107 3 Warehouse Ground Certified 2420 108 2 PostOffice Ground Certified 2423 145 3 Warehouse Ground Certified 2441 106 5 Warehouse Air Insured
Location
列では、まずBITAND
によってorder_status
と1(バイナリ001)が比較されます。比較されるのは重要なビット値のみです。したがって、右端のビットが1であるバイナリの値(奇数)は正と評価され、1が戻されます。偶数の場合は0(ゼロ)が戻されます。DECODE
ファンクションでは、BITAND
によって戻された値と1が比較されます。両方とも1の場合、場所はWarehouse(倉庫)になります。これらの値が異なる場合、場所はPostOffice(郵便局)になります。
Method
列とReceipt
列は、同様に計算されます。Method
では、BITAND
によってorder_status
と2(バイナリ010)にAND
演算が実行されます。Receipt
では、BITAND
によってorder_status
と4(バイナリ100)にAND
演算が実行されます。
CARDINALITY
は、ネストした表内の要素数を戻します。戻り型は、NUMBER
です。ネストした表が空であるかNULLの集合である場合、CARDINALITY
はNULL
を戻します。
次の例では、pm.print_media
サンプル表のネストした表の列ad_textdocs_ntab
内の要素数を示します。
SELECT product_id, CARDINALITY(ad_textdocs_ntab) Cardinality FROM print_media ORDER BY product_id, cardinality; PRODUCT_ID CARDINALITY ---------- ----------- 2056 3 2268 3 3060 3 3106 3
CAST
は、ある組込みデータ型またはコレクション型の値を、別の組込みデータ型またはコレクション型の値に変換します。
CAST
を使用すると、ある組込みデータ型またはコレクション型の値を、別の組込みデータ型またはコレクション型に変換できます。名前のないオペランド(日付や副問合せの結果セットなど)または名前付きのコレクション(VARRAYやネストした表など)を型互換の名前付きコレクションにキャストできます。type_name
は、組込みデータ型またはコレクション型の名前である必要があり、オペランドは、組込みデータ型であるか、またはその値がコレクション値である必要があります。
オペランドでは、expr
は組込みデータ型、コレクション型またはANYDATA
型のインスタンスのいずれかです。expr
がANYDATA
型のインスタンスである場合、CAST
はANYDATA
インスタンスの値を抽出し、その値がキャスト対象の型と一致する場合はその値を戻し、一致しない場合はNULLを戻します。MULTISET
は、副問合せの結果セットを取り、コレクション値を戻すようにOracle Databaseに通知します。表5-1に、どの組込みデータ型が、どの組込みデータ型にキャストできるかを示します(CAST
は、LONG
型、LONG
RAW
型、またはOracleが提供する型をサポートしていません)。
CAST
は、LOBデータ型のいずれも直接的にサポートしていません。CAST
を使用して、CLOB
値を文字データ型に変換するか、BLOB
値をRAW
データ型に変換すると、データベースは暗黙的にLOB値を文字またはRAWデータに変換し、結果値を明示的にターゲットのデータ型にキャストします。結果値がターゲットの型より大きい場合、エラーが戻されます。
CAST
... MULTISET
を使用してコレクション値を取得すると、CAST
ファンクションに渡される問合せ内のSELECT構文のリストのアイテムは、ターゲットのコレクション要素型に対応する属性型に変換されます。
注1: Datetime/Intervalには、DATE
、TIMESTAMP
、TIMESTAMP WITH TIMEZONE
、INTERVAL DAY TO SECOND
およびINTERVAL YEAR TO MONTH
が含まれます。
注2: UROWID
が索引構成表のROWID
の値を含んでいる場合、UROWID
をROWID
にキャストすることはできません。
名前付きコレクション型を別の名前付きコレクション型にキャストするには、両方のコレクションの要素が同じ型である必要があります。
副問合せの結果セットが複数行に評価される可能性がある場合は、MULTISET
キーワードを指定する必要があります。副問合せの結果である行は、それらの行がキャストされたコレクション値の要素を形成します。MULTISET
キーワードを省略すると、副問合せはスカラー副問合せとして処理されます。
次の例では、CAST
ファンクションをスカラー・データ型とともに使用します。
SELECT CAST('22-OCT-1997' AS TIMESTAMP WITH LOCAL TIME ZONE) FROM dual; SELECT product_id, CAST(ad_sourcetext AS VARCHAR2(30)) Text FROM print_media ORDER BY product_id, text;
後に続くCAST
の例は、サンプルの注文入力スキーマoe
で使用されているcust_address_typ
に基づいています。
CREATE TYPE address_book_t AS TABLE OF cust_address_typ; / CREATE TYPE address_array_t AS VARRAY(3) OF cust_address_typ; / CREATE TABLE cust_address ( custno NUMBER, street_address VARCHAR2(40), postal_code VARCHAR2(10), city VARCHAR2(30), state_province VARCHAR2(10), country_id CHAR(2)); CREATE TABLE cust_short (custno NUMBER, name VARCHAR2(31)); CREATE TABLE states (state_id NUMBER, addresses address_array_t);
次の例では、副問合せをキャストします。
SELECT s.custno, s.name, CAST(MULTISET(SELECT ca.street_address, ca.postal_code, ca.city, ca.state_province, ca.country_id FROM cust_address ca WHERE s.custno = ca.custno) AS address_book_t) FROM cust_short s ORDER BY s.custno, s.name;
CAST
では、VARRAY型の列をネストした表に変換します。
SELECT CAST(s.addresses AS address_book_t) FROM states s WHERE s.state_id = 111;
次の例では、この後に示す例で使用するオブジェクトを作成します。
CREATE TABLE projects (employee_id NUMBER, project_name VARCHAR2(10)); CREATE TABLE emps_short (employee_id NUMBER, last_name VARCHAR2(10)); CREATE TYPE project_table_typ AS TABLE OF VARCHAR2(10); /
次のMULTISET
式の例は、前述のオブジェクトを使用します。
SELECT e.last_name, CAST(MULTISET(SELECT p.project_name FROM projects p WHERE p.employee_id = e.employee_id ORDER BY p.project_name) AS project_table_typ) FROM emps_short e ORDER BY e.last_name;
CEIL
は、n
以上の最も小さい整数を戻します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。また、引数の数値データ型と同じデータ型を戻します。
次の例では、指定した注文の合計以上である最小の整数を戻します。
SELECT order_total, CEIL(order_total) FROM orders WHERE order_id = 2434; ORDER_TOTAL CEIL(ORDER_TOTAL) ----------- ----------------- 268651.8 268652
CHARTOROWID
は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
データ型の値をROWID
データ型に変換します。
このファンクションは、CLOB
データを直接的にサポートしていません。ただし、暗黙的なデータ変換を使用してCLOB
を引数として渡すことはできます。
次の例では、文字表記のROWIDをROWIDに変換します。(実際のROWIDは、各データベース・インスタンスによって異なります。)
SELECT last_name FROM employees WHERE ROWID = CHARTOROWID('AAAFd1AAFAAAABSAA/'); LAST_NAME ------------------------- Greene
CHR
は、データベース・キャラクタ・セットまたは各国語キャラクタ・セット(USING
NCHAR_CS
を指定している場合)の中のn
に等しい2進数を持つ文字を、VARCHAR2
値として戻します。
シングルバイト・キャラクタ・セットの場合、Oracle Databaseは、n
> 256に対してn mod 256
に等しい2進数を戻します。マルチバイト・キャラクタ・セットの場合、n
は1つのコードポイント全体として解決される必要があります。無効なコードポイントは検証されないため、無効なコードポイントを指定した場合の結果は、予測不能です。
このファンクションは、引数として、NUMBER
値、または暗黙的にNUMBER
型に変換可能な任意の値を取り、文字を戻します。
次の例は、データベース・キャラクタ・セットがWE8ISO8859P1と定義されているASCIIベースのマシンで実行されています。
SELECT CHR(67)||CHR(65)||CHR(84) "Dog" FROM DUAL; Dog --- CAT
キャラクタ・セットがWE8EBCDIC1047のEBCDICベースのマシンでも同じ結果を戻すには、前述の例を次のように修正する必要があります。
SELECT CHR(195)||CHR(193)||CHR(227) "Dog" FROM DUAL; Dog --- CAT
マルチバイト・キャラクタ・セットの場合、このように連結しても異なる結果となります。たとえば、a1a2
(a1
は1つ目のバイト、a2
は2つ目のバイト)という16進数の値を持つマルチバイト文字の場合、n
に対して「a1a2
」に等しい2進数または41378を指定する必要があります。
SELECT CHR(41378) FROM DUAL;
次の例のように、a2に等しい2進数と連結されたa1に等しい2進数を指定することはできません。
SELECT CHR(161)||CHR(162) FROM DUAL;
ただし、次の例のように、マルチバイト文字を連結するマルチバイトのコードポイント全体を連結することは可能です。この例では、a1a2
とa1a3
の16進数を持つマルチバイト文字を連結しています。
SELECT CHR(41378)||CHR(41379) FROM DUAL;
次の例では、各国語キャラクタ・セットがUTF16であると仮定します。
SELECT CHR (196 USING NCHAR_CS) FROM DUAL; CH -- Ä
このファンクションは、DBMS_DATA_MINING
パッケージまたはOracle Data Mining Java APIを使用して作成したモデルのクラスタリングで使用するためのものです。このファンクションは、mining_attribute_clause
で指定した一連の予測子のうち、最も確率の高い予測クラスタのクラスタ識別子を戻します。戻り値は、OracleのNUMBER
です。
mining_attribute_clause
は、PREDICTION
ファンクションと同様に動作します。詳細は、「mining_attribute_clause」を参照してください。
参照:
|
次の例では、指定したデータセットの顧客がグループ化されたクラスタを示します。
この例と前提条件のデータ・マイニング操作(dm_sh_clus_sample
モデルおよびdm_sh_sample_apply_prepared
ビューの作成など)は、デモ・ファイル$ORACLE_HOME/rdbms/demo/dmkmdemo.sql
で確認できます。データ・マイニングのデモ・ファイルの一般情報は、『Oracle Data Mining管理者ガイド』を参照してください。次に、このファンクションの構文の使用例を示します。
SELECT CLUSTER_ID(km_sh_clus_sample USING *) AS clus, COUNT(*) AS cnt FROM km_sh_sample_apply_prepared GROUP BY CLUSTER_ID(km_sh_clus_sample USING *) ORDER BY cnt DESC; CLUS CNT ---------- ---------- 2 580 10 199 6 185 8 115 12 98 16 82 19 81 15 68 18 65 14 27 10 rows selected.
このファンクションは、DBMS_DATA_MINING
パッケージまたはOracle Data Mining Java APIを使用して作成したモデルのクラスタリングで使用するためのものです。このファンクションは、指定したモデルに関連付けられたクラスタにある入力行のメンバーシップの確信度のメジャーを戻します。
cluster_id
には、モデル内のクラスタの識別子を指定します。このファンクションでは、指定したクラスタの確率を戻します。この句を指定しない場合、最適な予測クラスタに関連付けられた確率が戻ります。cluster_id
とCLUSTER_ID
ファンクションの組合せのない形式を使用して、クラスタIDと確率の最適な予測の組を取得できます。
mining_attribute_clause
は、PREDICTION
ファンクションと同様に動作します。詳細は、「mining_attribute_clause」を参照してください。
参照:
次の例では、可能性に基づいて、クラスタ2で最も代表的な顧客を10人決定します。
この例と前提条件のデータ・マイニング操作(dm_sh_clus_sample
モデルおよびdm_sh_sample_apply_prepared
ビューの作成など)は、デモ・ファイル$ORACLE_HOME/rdbms/demo/dmkmdemo.sql
で確認できます。データ・マイニングのデモ・ファイルの一般情報は、『Oracle Data Mining管理者ガイド』を参照してください。次に、このファンクションの構文の使用例を示します。
SELECT * FROM (SELECT cust_id, CLUSTER_PROBABILITY(km_sh_clus_sample, 2 USING *) prob FROM km_sh_sample_apply_prepared ORDER BY prob DESC) WHERE ROWNUM < 11; CUST_ID PROB ---------- ------ 100052 .9993 100962 .9993 101208 .9993 100281 .9993 100012 .9993 101009 .9992 100173 .9992 101176 .9991 100672 .9991 101420 .9991 10 rows selected.
このファンクションは、DBMS_DATA_MINING
パッケージまたはOracle Data Mining Java APIを使用して作成したモデルのクラスタリングで使用するためのものです。このファンクションは、指定した行が属している可能性のあるクラスタを含むオブジェクトのVARRAYを戻します。VARRAYの各オブジェクトは、クラスタIDとクラスタ確率を含むスカラー値の組です。オブジェクト・フィールドには、CLUSTER_ID
とPROBABILITY
の名前が付き、両方ともOracleのNUMBER
になります。
topN
引数には、正の整数を指定します。指定すると、予測クラスタの集合は、上位N
の確率値のいずれか持つ予測クラスタに制限されます。topN
を指定しないか、NULL
に設定すると、すべてのクラスタはコレクションに戻されます。複数のクラスタがN
番目の値に一致しても、N
個の値のみが戻されます。
cutoff
引数には、正の整数を指定し、戻されるクラスタを指定したカットオフ以上の確率を持つクラスタに制限します。NULL
をtopN
に指定し、必要なカットオフ値をcutoff
に指定すると、cutoff
のみをフィルタ処理できます。
topN
とcutoff
をともに指定すると、戻されるクラスタを上位N
の中で、しきい値を超える確率を持つクラスタに制限できます。
mining_attribute_clause
は、PREDICTION
ファンクションと同様に動作します。詳細は、「mining_attribute_clause」を参照してください。
次の例では、20%を超える可能性で顧客101362が属する各クラスタで、最も関連性の高い属性(確信度が55%を超える)を示します。
この例と前提条件のデータ・マイニング操作(dm_sh_clus_sample
モデル、ビューおよび型の作成など)は、デモ・ファイル$ORACLE_HOME/rdbms/demo/dmkmdemo.sql
で確認できます。データ・マイニングのデモ・ファイルの一般情報は、『Oracle Data Mining管理者ガイド』を参照してください。次に、このファンクションの構文の使用例を示します。
WITH clus_tab AS ( SELECT id, A.attribute_name aname, A.conditional_operator op, NVL(A.attribute_str_value, ROUND(DECODE(A.attribute_name, N.col, A.attribute_num_value * N.scale + N.shift, A.attribute_num_value),4)) val, A.attribute_support support, A.attribute_confidence confidence FROM TABLE(DBMS_DATA_MINING.GET_MODEL_DETAILS_KM('km_sh_clus_sample')) T, TABLE(T.rule.antecedent) A, km_sh_sample_norm N WHERE A.attribute_name = N.col (+) AND A.attribute_confidence > 0.55 ), clust AS ( SELECT id, CAST(COLLECT(Cattr(aname, op, TO_CHAR(val), support, confidence)) AS Cattrs) cl_attrs FROM clus_tab GROUP BY id ), custclus AS ( SELECT T.cust_id, S.cluster_id, S.probability FROM (SELECT cust_id, CLUSTER_SET(km_sh_clus_sample, NULL, 0.2 USING *) pset FROM km_sh_sample_apply_prepared WHERE cust_id = 101362) T, TABLE(T.pset) S ) SELECT A.probability prob, A.cluster_id cl_id, B.attr, B.op, B.val, B.supp, B.conf FROM custclus A, (SELECT T.id, C.* FROM clust T, TABLE(T.cl_attrs) C) B WHERE A.cluster_id = B.id ORDER BY prob DESC, cl_id ASC, conf DESC, attr ASC, val ASC; PROB CL_ID ATTR OP VAL SUPP CONF ------- ---------- --------------- --- --------------- ---------- ------- .7873 8 HOUSEHOLD_SIZE IN 9+ 126 .7500 .7873 8 CUST_MARITAL_ST IN Divorc. 118 .6000 ATUS .7873 8 CUST_MARITAL_ST IN NeverM 118 .6000 ATUS .7873 8 CUST_MARITAL_ST IN Separ. 118 .6000 ATUS .7873 8 CUST_MARITAL_ST IN Widowed 118 .6000 ATUS .2016 6 AGE >= 17 152 .6667 .2016 6 AGE <= 31.6 152 .6667 .2016 6 CUST_MARITAL_ST IN NeverM 168 .6667 ATUS 8 rows selected.
COALESCE
は、式のリストの最初のNULLでないexpr
を戻します。2つ以上の式を指定する必要があります。すべてのexpr
がNULLと評価された場合、このファンクションはNULLを戻します。
Oracle Databaseでは、短絡評価を使用します。データベースは、NULL
かどうかを判断する前にexpr
値のすべてを評価するのではなく、各expr
値を評価して、NULL
かどうかを判断します。
すべてのexpr
が数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型である場合、Oracle Databaseは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。
このファンクションはNVL
ファンクションを一般化したファンクションです。
COALESCE
は、CASE
式の変形として使用できます。次に例を示します。
COALESCE (expr1, expr2)
これは、次のCASE式と同じです。
CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE expr2 END
次の例も同様です。
COALESCE (expr1, expr2, ..., exprn), for n>=3
これは、次のCASE式と同じです。
CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE COALESCE (expr2, ..., exprn) END
次の例では、サンプル表oe.product_information
を使用して、製品のクリアランス・セールを企画します。製品の表示価格から10%値引きします。表示価格がない場合は、最小価格はセール価格となります。最小価格がない場合、セール価格は「5」となります。
SELECT product_id, list_price, min_price, COALESCE(0.9*list_price, min_price, 5) "Sale" FROM product_information WHERE supplier_id = 102050 ORDER BY product_id, list_price, min_price, "Sale"; PRODUCT_ID LIST_PRICE MIN_PRICE Sale ---------- ---------- ---------- ---------- 1769 48 43.2 1770 73 73 2378 305 247 274.5 2382 850 731 765 3355 5
COLLECT
は、任意の型の列を引数に取り、選択された行から、入力された型のネストした表を作成する集計ファンクションです。このファンクションから正確な結果を取得するには、このファンクションをCAST
ファンクション内で使用する必要があります。
column
自体がコレクションである場合、COLLECT
の出力はコレクションのネストした表になります。column
がユーザー定義型である場合は、オプションのDISTINCT
、UNIQUE
およびORDER
BY
句を使用できるように、column
にMAP
またはORDER
メソッドが定義されている必要があります。
次の例では、oe.customers
サンプル表の電話番号のVARRAY列からネストした表を作成します。
CREATE TYPE phone_book_t AS TABLE OF phone_list_typ; / SELECT CAST(COLLECT(phone_numbers) AS phone_book_t) Phone_Book FROM customers ORDER BY phone_book;
COMPOSE
は、引数として任意のデータ型の文字列または文字列に変換する式を取り、入力されたものと同じキャラクタ・セットでUnicode文字列を戻します。char
のデータ型は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
です。たとえば、oウムラウト・コードポイントは、ウムラウト・コードポイントによって修飾されたo
コードポイントとして戻されます。
COMPOSE
は、NFC正規形の文字列を戻します。より排他的な設定の場合は、まずCANONICAL
設定を使用してDECOMPOSE
を呼び出し、次にCOMPOSE
を呼び出すことができます。この組合せによって、NFKC正規形の文字列が戻されます。
暗黙的な変換を使用して、CLOB
およびNCLOB
の値がサポートされます。char
が文字のLOB値の場合、COMPOSE
演算の前にVARCHAR
値に変換されます。特定の開発環境で、LOB値のサイズがVARCHAR
のサポートする長さを超える場合、この演算は失敗します。
次の例は、oウムラウトのコードポイントを戻します。
SELECT COMPOSE ( 'o' || UNISTR('\0308') ) FROM DUAL; CO -- ö
CONCAT
は、char2
に連結されているchar1
を戻します。char1
およびchar2
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。char1
と同じキャラクタ・セットの文字列が戻されます。そのデータ型は、引数のデータ型によって決まります。
2つの異なるデータ型を連結すると、可逆式変換となるデータ型が戻されます。したがって、引数の1つがLOBの場合、戻り値はLOBとなります。引数の1つが各国語データ型の場合は、戻り値は各国語データ型となります。たとえば、次のようになります。
CONCAT
(CLOB
, NCLOB
)はNCLOB
を戻します。
CONCAT
(NCLOB
, NCHAR
)はNCLOB
を戻します。
CONCAT
(NCLOB
, CHAR
)はNCLOB
を戻します。
CONCAT
(NCHAR
, CLOB
)はNCLOB
を戻します。
このファンクションは、連結演算子(||)と同等です。
次の例では、ネストを使用して3つの文字列を連結します。
SELECT CONCAT(CONCAT(last_name, '''s job category is '), job_id) "Job" FROM employees WHERE employee_id = 152 ORDER BY "Job"; Job ------------------------------------------------------ Hall's job category is SA_REP
CONVERT
は、文字列を、あるキャラクタ・セットから別のキャラクタ・セットに変換します。
char
は変換する値です。charは、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。
dest_char_set
は、char
が変換されるキャラクタ・セットの名前です。
source_char_set
は、char
をデータベースに格納しているキャラクタ・セットの名前です。デフォルト値はデータベース・キャラクタ・セットです。
CHAR
とVARCHAR2
の戻り値は、VARCHAR2
です。NCHAR
とNVARCHAR2
の戻り値は、NVARCHAR2
です。CLOB
の戻り値はCLOB
、NCLOB
の戻り値はNCLOB
です。
変換先キャラクタ・セットと変換元キャラクタ・セットの引数として、リテラルまたはキャラクタ・セットの名前を含んでいる列を指定できます。
完全に文字を変換するには、変換先キャラクタ・セットが変換元キャラクタ・セットで定義されているすべての文字を表現できる必要があります。文字が変換先キャラクタ・セットに存在しないと、置換文字が使用されます。置換文字は、キャラクタ・セット定義の一部として定義できます。
次の例では、Latin-1文字列をASCIIに変換するキャラクタ・セットの変換を示します。これは、同じ文字列をWE8ISO8859P1データベースからUS7ASCIIデータベースへインポートした場合と同じ結果が得られます。
SELECT CONVERT('Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1') FROM DUAL; CONVERT('ÄÊÍÕØABCDE' --------------------- A E I ? ? A B C D E ?
一般的なキャラクタ・セットを次に示します。
次のようにV$NLS_VALID_VALUES
ビューを問い合せて、有効なキャラクタ・セットのリストを取得できます。
SELECT * FROM V$NLS_VALID_VALUES WHERE parameter = 'CHARACTERSET'
CORR
は、数値の組の集合に対する相関係数を戻します。これは、集計ファンクションまたは分析ファンクションとして使用できます。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。Oracleは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。
Oracle Databaseは、expr1
またはexpr2
がNULLである組を排除した後、このファンクションを(expr1
, expr2
)の集合に適用します。その後、Oracleは次の計算を行います。
COVAR_POP(expr1, expr2) / (STDDEV_POP(expr1) * STDDEV_POP(expr2))
ファンクションは、NUMBER
型の値を戻します。ファンクションが空の集合に適用されると、NULLを戻します。
次の例では、oe.product_information
サンプル表の重さクラスごとの製品の表示価格と最小価格の相関係数を計算します。
SELECT weight_class, CORR(list_price, min_price) "Correlation" FROM product_information GROUP BY weight_class ORDER BY weight_class, "Correlation"; WEIGHT_CLASS Correlation ------------ ----------- 1 .999149795 2 .999022941 3 .998484472 4 .999359909 5 .999536087
次の例では、会社での勤務年数と給与の相関を従業の役職別に示します。結果セットでは、指定した業務の従業員ごとに同じ相関を示します。
SELECT employee_id, job_id, TO_CHAR((SYSDATE - hire_date) YEAR TO MONTH ) "Yrs-Mns", salary, CORR(SYSDATE-hire_date, salary) OVER(PARTITION BY job_id) AS "Correlation" FROM employees WHERE department_id in (50, 80) ORDER BY job_id, employee_id; EMPLOYEE_ID JOB_ID Yrs-Mns SALARY Correlation ----------- ---------- ------- ---------- ----------- 145 SA_MAN +08-07 14000 .912385598 146 SA_MAN +08-04 13500 .912385598 147 SA_MAN +08-02 12000 .912385598 148 SA_MAN +05-07 11000 .912385598 149 SA_MAN +05-03 10500 .912385598 150 SA_REP +08-03 10000 .80436755 151 SA_REP +08-02 9500 .80436755 152 SA_REP +07-09 9000 .80436755 153 SA_REP +07-01 8000 .80436755 154 SA_REP +06-05 7500 .80436755 155 SA_REP +05-06 7000 .80436755 ...
CORR_
*ファンクションを次に示します。
CORR
ファンクション(「CORR」を参照)は、ピアソンの相関係数を計算し、入力として数式を必要とします。CORR_
*ファンクションは、ノンパラメトリックまたは順位相関をサポートします。これらのファンクションを使用すると、式間の相関を順序尺度化して求めることができます(値の順序付けが可能な場合)。相関係数は-1〜1の範囲の値となります。1は完全な正相関、-1は完全な逆相関(一方の変数が減少すると他方の変数が増加する)、および0(ゼロ)に近い値は無相関を表します。
これらのファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。Oracle Databaseは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、計算を実行してNUMBER
を戻します。
expr1
およびexpr2
は、分析対象の2つの変数です。3つ目の引数はVARCHAR2
型の戻り値です。3つ目の引数を指定しない場合、デフォルトでCOEFFICIENT
が戻り値になります。戻り値の意味を次の表に示します。
戻り値 | 意味 |
---|---|
|
相関の係数 |
|
相関の正の片側有意 |
|
|
|
相関の負の片側有意 |
|
相関の両側有意 |
CORR_S
は、スピアマンの順位相関係数(ロー)を計算します。入力式は、観測値の組(xi, yi)の集合である必要があります。このファンクションは、最初に各値を順位に置き換えます。各xiの値は、標本内の他のすべてのxi中での順位に置き換えられ、各yiの値は、他のすべてのyi中での順位に置き換えられます。したがって、各xiおよび各yiは1〜n
の値となります。ここでn
は、値の組の合計数です。同順位の場合は、値がわずかに異なっていた場合に付けられる順位の平均が割り当てられます。その後このファンクションは、順位の線形相関係数を計算します。
次の例では、スピアマンのロー相関係数を使用して、salary
とcommission_pct
、salary
とemployee_id
の2つの異なる比較ごとに相関係数を導出します。
SELECT COUNT(*) count, CORR_S(salary, commission_pct) commission, CORR_S(salary, employee_id) empid FROM employees; COUNT COMMISSION EMPID ---------- ---------- ---------- 107 .735837022 -.04482358
CORR_K
は、ケンドールの順位相関係数(タウb)を計算します。CORR_S
と同様に、入力式は観測値の組(xi, yi)の集合です。係数を計算するために、このファンクションは一致した組と一致しない組の数をカウントします。xとyの値がいずれも大きい観測値の組は一致しています。xの値が大きくyの値が小さい観測値の組は一致していません。
タウbでの有意性は、タウbによって示される相関が偶然の結果である確率です(0〜1の値)。この値が小さい場合、タウbが正の値であれば有意な相関が存在します(タウbが負の値の場合は逆相関)。
次の例では、ケンドールのタウb相関係数を使用して、従業員の給与と歩合の割合(パーセント)間に相関があるかどうかを判断します。
SELECT CORR_K(salary, commission_pct, 'COEFFICIENT') coefficient, CORR_K(salary, commission_pct, 'TWO_SIDED_SIG') two_sided_p_value FROM hr.employees; COEFFICIENT TWO_SIDED_P_VALUE ----------- ----------------- .603079768 3.4702E-07
COS
は、n
(ラジアンで表された角度)のコサインを戻します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。引数がBINARY_FLOAT
の場合、このファンクションはBINARY_DOUBLE
を戻します。それ以外の場合、引数と同じ数値データ型を戻します。
次の例では、180度のコサインを戻します。
SELECT COS(180 * 3.14159265359/180) "Cosine of 180 degrees" FROM DUAL; Cosine of 180 degrees --------------------- -1
COSH
は、n
の双曲線コサインを戻します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。引数がBINARY_FLOAT
の場合、このファンクションはBINARY_DOUBLE
を戻します。それ以外の場合、引数と同じ数値データ型を戻します。
次の例では、0の双曲線コサインを戻します。
SELECT COSH(0) "Hyperbolic cosine of 0" FROM DUAL; Hyperbolic cosine of 0 ---------------------- 1
COUNT
は、問合せによって戻された行の数を戻します。これは、集計ファンクションまたは分析ファンクションとして使用できます。
DISTINCT
を指定する場合は、analytic_clause
のquery_partition_clause
のみ指定できます。order_by_clause
およびwindowing_clause
は指定できません。
expr
を指定すると、COUNT
はexpr
がNULLでない行数を戻します。expr
のすべての行を数えるか、または異なる値のみを数えることができます。
アスタリスク(*)を指定すると、このファンクションは重複値およびNULL値を含むすべての行を戻します。COUNT
はNULLを戻しません。
次の例では、COUNT
を集計ファンクションとして使用します。
SELECT COUNT(*) "Total" FROM employees; Total ---------- 107 SELECT COUNT(*) "Allstars" FROM employees WHERE commission_pct > 0; Allstars --------- 35 SELECT COUNT(commission_pct) "Count" FROM employees; Count ---------- 35 SELECT COUNT(DISTINCT manager_id) "Managers" FROM employees; Managers ---------- 18
次の例では、employees
表の各従業員について、その従業員の給与より50ドル少ない金額から150ドル多い金額の範囲の給与を得ている従業員の数を計算します。
SELECT last_name, salary, COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING) AS mov_count FROM employees ORDER BY last_name, salary, COUNT(*); LAST_NAME SALARY MOV_COUNT ------------------------- ---------- ---------- Olson 2100 3 Markle 2200 2 Philtanker 2200 2 Landry 2400 8 Gee 2400 8 Colmenares 2500 10 Marlow 2500 10 Patel 2500 10 . . .
COVAR_POP
は、数値の組の集合に対する母集団共分散を戻します。これは、集計ファンクションまたは分析ファンクションとして使用できます。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。Oracleは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。
Oracle Databaseは、expr1
またはexpr2
がNULLであるすべての組を排除した後、このファンクションを(expr1
, expr2
)の組の集合に適用します。その後、Oracleは次の計算を行います。
(SUM(expr1 * expr2) - SUM(expr2) * SUM(expr1) / n) / n
ここで、n
は(expr1
, expr2
)の組の数です(ただし、expr1
およびexpr2
の両方がNULLではない場合です)。
ファンクションは、NUMBER
型の値を戻します。ファンクションが空の集合に適用されると、NULLを戻します。
次の例では、サンプル表hr.employees
を使用して、勤務時間(SYSDATE
- hire_date
)と給与の母集団共分散と標本共分散を計算します。
SELECT job_id, COVAR_POP(SYSDATE-hire_date, salary) AS covar_pop, COVAR_SAMP(SYSDATE-hire_date, salary) AS covar_samp FROM employees WHERE department_id in (50, 80) GROUP BY job_id ORDER BY job_id, covar_pop, covar_samp; JOB_ID COVAR_POP COVAR_SAMP ---------- ----------- ----------- SA_MAN 660700 825875 SA_REP 579988.466 600702.34 SH_CLERK 212432.5 223613.158 ST_CLERK 176577.25 185870.789 ST_MAN 436092 545115
次の例では、デモ・スキーマoe
の製品の表示価格および最小価格の累積標本共分散を計算します。
SELECT product_id, supplier_id, COVAR_POP(list_price, min_price) OVER (ORDER BY product_id, supplier_id) AS CUM_COVP, COVAR_SAMP(list_price, min_price) OVER (ORDER BY product_id, supplier_id) AS CUM_COVS FROM product_information p WHERE category_id = 29 ORDER BY product_id, supplier_id; PRODUCT_ID SUPPLIER_ID CUM_COVP CUM_COVS ---------- ----------- ---------- ---------- 1774 103088 0 1775 103087 1473.25 2946.5 1794 103096 1702.77778 2554.16667 1825 103093 1926.25 2568.33333 2004 103086 1591.4 1989.25 2005 103086 1512.5 1815 2416 103088 1475.97959 1721.97619 . . .
COVAR_SAMP
は、数値の組の集合の標本共分散を戻します。これは、集計ファンクションまたは分析ファンクションとして使用できます。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。Oracleは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。
Oracle Databaseは、expr1
またはexpr2
がNULLであるすべての組を排除した後、このファンクションを(expr1
, expr2
)の組の集合に適用します。その後、Oracleは次の計算を行います。
(SUM(expr1 * expr2) - SUM(expr1) * SUM(expr2) / n) / (n-1)
ここで、n
は(expr1
, expr2
)の組の数です(ただし、expr1
およびexpr2
の両方がNULLではない場合です)。
ファンクションは、NUMBER
型の値を戻します。ファンクションが空の集合に適用されると、NULLを戻します。
「COVAR_POP」の集計の例を参照してください。
「COVAR_POP」の分析の例を参照してください。
CUBE_TABLE
は、キューブまたはディメンションのデータを抽出し、SQLベースのアプリケーションで使用可能な2次元形式のリレーショナル表に戻します。
このファンクションは、1つのVARCHAR2
引数を取ります。オプションのHIERARCHY句を使用すると、ディメンション階層を指定できます。キューブでは複数のHIERARCHY句(ディメンションごとに1つ)を使用できます。
次の様々なタイプの表を生成できます。
CUBE_TABLE
は表ファンクションであり、SELECT
文のコンテキストで常に次の構文で使用されます。
SELECT ... FROM TABLE(CUBE_TABLE('arg'));
次のSELECT
文は、GLOBAL
スキーマのCHANNEL
のディメンション表を生成します。
SELECT * FROM TABLE(CUBE_TABLE('global.channel')); DIM_KEY LEVEL_NAME LONG_DESCRIP SHORT_DESCRI TOTAL_CHANNEL_ID CHANNEL_ID -------- --------------- ------------ ------------ ---------------- ---------- 1 TOTAL_CHANNEL All Channels All Channels 1 2 CHANNEL Direct Sales Direct Sales 1 2 3 CHANNEL Catalog Catalog 1 3 4 CHANNEL Internet Internet 1 4
次の文は、UNITS_CUBE
のキューブ表を生成します。この文は、表をMARKET_ROLLUP
階層およびCALENDAR
階層に制限します。
SELECT * FROM TABLE(CUBE_TABLE( 'global.units_cube HIERARCHY customer market_rollup HIERARCHY time calendar')); SALES UNITS COST TIME CUSTOMER PRODUCT CHANNEL ---------- ---------- ---------- -------- -------- -------- -------- 134109248 330425 124918967 2 7 1 1 32275009.5 77425 30255208 10 7 1 1 10768750.7 25780 10058324.5 36 7 1 1 109261.64 278 101798.32 36 5 1 1 22371.47 53 20887.54 36 36 1 1 . . .
CUME_DIST
は、値のグループにある値の累積分布値を計算します。CUME_DIST
が戻す値の範囲は、0より大きく1以下です。連結値は、常に同じ累積分布値に対して評価を行います。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。Oracle Databaseは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、計算を実行してNUMBER
を戻します。
CUME_DIST
は、ファンクションの引数および対応するソート指定によって識別される不確定な行r
に対して、集計グループ内の行の中での行r
の関連する位置を計算します。Oracleは、不確定な行r
を集計される行のグループに挿入するように計算します。このファンクションの引数は、各集計グループ内の1つの不確定行を識別します。このため、すべての引数は、集計グループ内で定数式と評価される必要があります。定数引数式および集計のORDER
BY
句の式の位置は、一致します。このため、引数の数は同じであり、その型は互換性がある必要があります。
CUME_DIST
は、値のグループにある特定の値の相対位置を計算します。行r
について、昇順で順序付けられているとします。r
のCUME_DIST
は、r
の値以下の値の行数を、評価される行の数(問合せ結果セットまたはパーティション)で割った数です。
次の例では、サンプル表oe.employees
の従業員の中から、給与が15,500ドルであり、歩合が5%の不確定な従業員の累積分布を計算します。
SELECT CUME_DIST(15500, .05) WITHIN GROUP (ORDER BY salary, commission_pct) "Cume-Dist of 15500" FROM employees; Cume-Dist of 15500 ------------------ .972222222
次の例では、購買部門の各従業員の給与のパーセンタイルを計算します。たとえば、事務員の40%が、Himuroの給与以下の給与を得ていることがわかります。
SELECT job_id, last_name, salary, CUME_DIST() OVER (PARTITION BY job_id ORDER BY salary) AS cume_dist FROM employees WHERE job_id LIKE 'PU%' ORDER BY job_id, last_name, salary, cume_dist; JOB_ID LAST_NAME SALARY CUME_DIST ---------- ------------------------- ---------- ---------- PU_CLERK Baida 2900 .8 PU_CLERK Colmenares 2500 .2 PU_CLERK Himuro 2600 .4 PU_CLERK Khoo 3100 1 PU_CLERK Tobias 2800 .6 PU_MAN Raphaely 11000 1
CURRENT_DATE
は、セッション・タイムゾーンの現在の日付をDATE
データ型のグレゴリオ暦の値で戻します。
次の例では、CURRENT_DATE
がセッション・タイムゾーンによって異なることを示します。
ALTER SESSION SET TIME_ZONE = '-5:0'; ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL; SESSIONTIMEZONE CURRENT_DATE --------------- -------------------- -05:00 29-MAY-2000 13:14:03 ALTER SESSION SET TIME_ZONE = '-8:0'; SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL; SESSIONTIMEZONE CURRENT_DATE --------------- -------------------- -08:00 29-MAY-2000 10:14:33
CURRENT_TIMESTAMP
は、セッション・タイムゾーンの現在の日付および時刻をTIMESTAMP
WITH
TIME
ZONE
データ型の値で戻します。タイムゾーン・オフセットは、SQLセッションの現在のローカル時刻を反映します。精度の指定を省略した場合のデフォルトは6です。このファンクションとLOCALTIMESTAMP
との違いは、CURRENT_TIMESTAMP
は、TIMESTAMP
WITH
TIME
ZONE
の値を戻し、LOCALTIMESTAMP
はTIMESTAMP
の値を戻す点です。
オプションの引数では、precision
は、戻される時刻の値の小数秒の精度を指定します。
次の例では、CURRENT_TIMESTAMP
がセッション・タイムゾーンによって異なることを示します。
ALTER SESSION SET TIME_ZONE = '-5:0'; ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL; SESSIONTIMEZONE CURRENT_TIMESTAMP --------------- --------------------------------------------------- -05:00 04-APR-00 01.17.56.917550 PM -05:00 ALTER SESSION SET TIME_ZONE = '-8:0'; SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL; SESSIONTIMEZONE CURRENT_TIMESTAMP --------------- ---------------------------------------------------- -08:00 04-APR-00 10.18.21.366065 AM -08:00
CURRENT_TIMESTAMP
で書式マスクを使用する場合は、ファンクションが戻す値と書式マスクを一致させてください。たとえば、次の表の場合を考えます。
CREATE TABLE current_test (col1 TIMESTAMP WITH TIME ZONE);
ファンクションが戻す型のTIME
ZONE
の部分がマスクに含まれていないため、次の文は正常に実行されません。
INSERT INTO current_test VALUES (TO_TIMESTAMP_TZ(CURRENT_TIMESTAMP, 'DD-MON-RR HH.MI.SSXFF PM'));
次の文では、CURRENT_TIMESTAMP
の戻り値の型と一致する正しい書式マスクが使用されています。
INSERT INTO current_test VALUES (TO_TIMESTAMP_TZ (CURRENT_TIMESTAMP, 'DD-MON-RR HH.MI.SSXFF PM TZH:TZM'));
CV
ファンクションは、SELECT
文のmodel_clause
でのみ、かつモデル・ルールの右側でのみ使用できます。戻り値は、ルールの左側から右側に送られたディメンション列またはパーティション列の現在の値です。このファンクションをmodel_clause
で使用するとディメンション列に対する相対索引を作成できます。戻り型は、ディメンション列のデータ型です。引数を指定しない場合、セル参照内のファンクションの相対位置に対応付けられたディメンション列がデフォルトで使用されます。
CV
ファンクションは、セル参照外でも使用できます。その場合は、dimension_column
が必要です。
次の例では、ディメンション列(マウス・パッドまたはスタンダード・マウス)の1999年および2000年の現在の値が表す製品の売上の合計を、その製品の2001年の売上に割り当てます。
SELECT country, prod, year, s FROM sales_view_ref MODEL PARTITION BY (country) DIMENSION BY (prod, year) MEASURES (sale s) IGNORE NAV UNIQUE DIMENSION RULES UPSERT SEQUENTIAL ORDER ( s[FOR prod IN ('Mouse Pad', 'Standard Mouse'), 2001] = s[CV( ), 1999] + s[CV( ), 2000] ) ORDER BY country, prod, year; COUNTRY PROD YEAR S ---------- ----------------------------------- -------- --------- France Mouse Pad 1998 2509.42 France Mouse Pad 1999 3678.69 France Mouse Pad 2000 3000.72 France Mouse Pad 2001 6679.41 France Standard Mouse 1998 2390.83 France Standard Mouse 1999 2280.45 France Standard Mouse 2000 1274.31 France Standard Mouse 2001 3554.76 Germany Mouse Pad 1998 5827.87 Germany Mouse Pad 1999 8346.44 Germany Mouse Pad 2000 7375.46 Germany Mouse Pad 2001 15721.9 Germany Standard Mouse 1998 7116.11 Germany Standard Mouse 1999 6263.14 Germany Standard Mouse 2000 2637.31 Germany Standard Mouse 2001 8900.45 16 rows selected.
この例では、ビューsales_view_ref
が必要です。このビューを作成する方法については、「MODEL句の例:」を参照してください。
DATAOBJ_TO_PARTITION
は、ドメイン索引データの格納に使用するシステム・パーティション表でデータ・メンテナンスまたは問合せ操作を実行するデータ・カートリッジ開発者にのみ役立ちます。DML操作や問合せ操作は、ドメイン索引の実表での対応する操作によってトリガーされます。
このファンクションは、引数として実表の名前と実表のパーティションのパーティションIDを取ります。これらはともに、適切なODCIIndexメソッドによってファンクションに渡されます。ファンクションは、対応するシステムパーティション表のパーティションIDを戻します。このIDは、システム・パーティション表の該当パーティションで操作(DMLまたは問合せ)を実行する際に使用できます。
DBTIMEZONE
ファンクションは、データベース・タイムゾーンの値を戻します。戻り型は、タイムゾーン・オフセット('[+|-]TZH:TZM'
という書式の文字列型)またはタイムゾーン地域名です。これは、最近のCREATE
DATABASE
またはALTER
DATABASE
文でユーザーが指定したデータベース・タイムゾーンの値によって異なります。
次の例では、データベース・タイムゾーンがUTCタイムゾーンに設定されていると想定します。
SELECT DBTIMEZONE FROM DUAL; DBTIME ------ +00:00
DECODE
ファンクションは、expr
と各search
の値を1つずつ比較します。expr
がsearch
と等しい場合、Oracle Databaseは対応するresult
を戻します。一致する値が見つからない場合は、default
を戻します。default
が省略されている場合は、NULLを戻します。
引数は、任意の数値型(NUMBER
、BINARY_FLOAT
、BINARY_DOUBLE
)または文字列型です。
expr
およびsearch
が文字データである場合、Oracleは、非空白埋め比較セマンティクスを使用してそれらを比較します。expr
、search
およびresult
のデータ型は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
です。戻される文字列は、VARCHAR2
データ型で、最初のresult
パラメータと同じキャラクタ・セットの文字列です。
search-result
の組が数値である場合、Oracleはすべてのsearch-result
の式と最初のexpr
を比較して、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。
search
、result
およびdefault
の値は、式から導出できます。Oracle Databaseでは、短絡評価を使用します。データベースは、search
値のいずれかとexpr
を比較する前にすべてのsearch値を評価するのではなく、各search値とexpr
を比較する前にのみ、各search
値を評価します。その結果、expr
と等しいsearch
が見つかると、Oracleはその後のsearch
を評価しません。
比較する前に、Oracleはexpr
と各search
値を、最初のsearch
値のデータ型に自動的に変換します。Oracleは、戻り値を最初のresult
と同じデータ型に自動的に変換します。最初のresult
のデータ型がCHAR
の場合、または最初のresult
がNULLの場合、Oracleは戻り値をVARCHAR2
データ型の値に変換します。
DECODE
ファンクションでは、Oracleは2つのNULLを同等とみなします。expr
がNULLの場合、Oracleは最初のsearch
値のresult
もNULLとして戻します。
DECODE
ファンクションのコンポーネントの最大数は、expr
、search
、result
、default
を含めて255です。
参照:
|
この例では、warehouse_id
の値をデコードします。warehouse_id
が1の場合「Southlake
」を、warehouse_id
が2の場合は「San Francisco
」を戻します。warehouse_id
が1、2、3、4のいずれでもない場合、ファンクションは「Non domestic
」を戻します。
SELECT product_id, DECODE (warehouse_id, 1, 'Southlake', 2, 'San Francisco', 3, 'New Jersey', 4, 'Seattle', 'Non domestic') "Location" FROM inventories WHERE product_id < 1775 ORDER BY product_id, "Location";
DECOMPOSE
は、Unicodeキャラクタに対してのみ有効です。DECOMPOSE
は、任意のデータ型の文字列を引数として取り、入力と同じキャラクタ・セットで分解されたUnicodeの文字列を戻します。たとえば、oウムラウト・コードポイントは、ウムラウト・コードポイントが続く「o」コードポイントとして戻されます。
string
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。
CANONICAL
を使用すると標準的な分解が行われ、(たとえば、COMPOSE
ファンクションを使用して)元の文字列への再構成が可能になります。これはデフォルトであり、NFD正規形の文字列が戻されます。
COMPATIBILITY
を使用すると互換モードで分解が行われます。このモードでは、再構成はできません。このモードは、半角および全角のカタカナ文字を分解する場合など、外的な書式またはスタイル情報なしに再構成を行うことが望ましくない場合に有効です。このモードでは、NFKD正規形の文字列が戻されます。
暗黙的な変換を使用して、CLOB
およびNCLOB
の値がサポートされます。char
が文字のLOB値の場合、COMPOSE
演算の前にVARCHAR
値に変換されます。特定の開発環境で、LOB値のサイズがVARCHAR
のサポートする長さを超える場合、この演算は失敗します。
次の例では、文字列「Châteaux」をその要素のコードポイントに分解します。
SELECT DECOMPOSE ('Châteaux') FROM DUAL; DECOMPOSE --------- Cha^teaux
DELETEXML
は、ターゲットXMLのXPath式で一致する単一または複数のノードを削除します。
XMLType_instance
は、XMLType
のインスタンスです。
XPath_string
は、削除するノードを1つ以上指定するXPath式です。先頭にスラッシュを付けて絶対XPath_string
を指定したり、先頭のスラッシュを省略して相対XPath_string
を指定できます。先頭のスラッシュを省略した場合、相対パスのコンテキストは、デフォルトでルート・ノードに設定されます。XPath_string
で指定したノードの子ノードも削除されます。
namespace_string
は、XPath_string
のネームスペース情報を提供します。このパラメータは、VARCHAR2
型である必要があります。次の例では、「APPENDCHILDXML」の例で変更したウェアハウスの1つのwarehouse_spec
から/Owner
ノードを削除します。
UPDATE warehouses SET warehouse_spec = DELETEXML(warehouse_spec, '/Warehouse/Building/Owner') WHERE warehouse_id = 2; SELECT warehouse_id, warehouse_spec FROM warehouses WHERE warehouse_id in (2,3); ID WAREHOUSE_SPEC ---------- ----------------------------------- 2 <?xml version="1.0"?> <Warehouse> <Building>Rented</Building> <Area>50000</Area> <Docks>1</Docks> <DockType>Side load</DockType> <WaterAccess>Y</WaterAccess> <RailAccess>N</RailAccess> <Parking>Lot</Parking> <VClearance>12 ft</VClearance> </Warehouse> 3 <?xml version="1.0"?> <Warehouse> <Building>Rented <Owner>Grandco</Owner> <Owner>ThirdOwner</Owner> <Owner>LesserCo</Owner> </Building> <Area>85700</Area> <DockType/> <WaterAccess>N</WaterAccess> <RailAccess>N</RailAccess> <Parking>Street</Parking> <VClearance>11.5 ft</VClearance> </Warehouse>
DENSE_RANK
は、順序付けされた行のグループ内の行のランクを計算し、そのランクをNUMBER
として戻します。ランクは1から始まる連続した整数です。ランクの最大値は、問合せが戻す一意の数値です。ランクの値は、連続した整数です。ランク付け基準と同じ値を持つ行は、同じランクになります。このファンクションは、上位N番および下位N番のレポートに有効です。
このファンクションは、引数に任意の数値データ型を受け入れ、NUMBER
を戻します。
DENSE_RANK
は、ファンクションの引数によって識別される不確定な行の稠密ランクを、与えられたソート指定で計算します。ファンクションの引数は、各集計グループの単一行を識別するため、すべての引数は各集計グループ内で定数式に評価される必要があります。定数引数式および集計のorder_by_clause
の式の位置は、一致します。このため、引数の数は同じであり、型は互換性がある必要があります。
DENSE_RANK
は、他の行について、問合せで戻される各行のランクを計算します。この計算は、order_by_clause
にあるvalue_exprs
の値に基づいて行われます。
次の例では、サンプル表oe.employees
から、給与が15,500ドルであり、歩合が5%の仮想の従業員のランクを計算します。
SELECT DENSE_RANK(15500, .05) WITHIN GROUP (ORDER BY salary DESC, commission_pct) "Dense Rank" FROM employees; Dense Rank ------------------- 3
次の文は、人事部門または購買部門で働くすべての従業員の部門名、従業員名および給与を選択します。その後、この2つの部門それぞれについて、一意の各給与に対するランクを計算します。同じ給与は同じランクになります。この例と、「RANK」の例を比較してください。
SELECT d.department_name, e.last_name, e.salary, DENSE_RANK() OVER (PARTITION BY e.department_id ORDER BY e.salary) AS drank FROM employees e, departments d WHERE e.department_id = d.department_id AND d.department_id IN ('30', '40') ORDER BY e.last_name, e.salary, d.department_name, drank; DEPARTMENT_NAME LAST_NAME SALARY DRANK c------------------------------ ------------------------- ---------- ---------- Purchasing Baida 2900 4 Purchasing Colmenares 2500 1 Purchasing Himuro 2600 2 Purchasing Khoo 3100 5 Human Resources Mavris 6500 1 Purchasing Raphaely 11000 6 Purchasing Tobias 2800 3
DEPTH
は、UNDER_PATH
およびEQUALS_PATH
条件でのみ使用される補助ファンクションです。このファンクションは、同じ相関変数を持つUNDER_PATH
条件によって指定されるパスのレベル数を戻します。
correlation_integer
は任意のNUMBER
整数です。文に複数の一次条件が含まれている場合に、この補助ファンクションをその一次条件と関連付けるために使用します。1未満の値は1として扱われます。
EQUALS_PATH
およびUNDER_PATH
条件は、2つの補助ファンクションDEPTH
およびPATH
を取ることができます。次に、その2つの補助ファンクションの使用方法を示します。この例では、XML Schemaであるwarehouses.xsd
(「SQL文でのXMLの使用方法」で作成)が存在することを前提としています。
SELECT PATH(1), DEPTH(2) FROM RESOURCE_VIEW WHERE UNDER_PATH(res, '/sys/schemas/OE', 1)=1 AND UNDER_PATH(res, '/sys/schemas/OE', 2)=1; PATH(1) DEPTH(2) -------------------------------- -------- /www.example.com 1 /www.example.com/xwarehouses.xsd 2
DEREF
は、引数expr
のオブジェクト参照を戻します。この場合、expr
はオブジェクトにREF
を戻す必要があります。問合せでこのファンクションを使用しない場合、次の例で示すとおり、かわりにREF
のオブジェクトIDを戻します。
サンプル・スキーマoe
には、cust_address_typ
というオブジェクト型が含まれます。「REF制約の例」では、類似する型cust_address_typ_new
、およびその型へのREF
である1つの列を含む表を作成します。次の例では、その列に挿入を行う方法、およびDEREF
を使用して列から情報を抽出する方法を示します。
INSERT INTO address_table VALUES ('1 First', 'G45 EU8', 'Paris', 'CA', 'US'); INSERT INTO customer_addresses SELECT 999, REF(a) FROM address_table a; SELECT address FROM customer_addresses ORDER BY address; ADDRESS -------------------------------------------------------------------------------- 000022020876B2245DBE325C5FE03400400B40DCB176B2245DBE305C5FE03400400B40DCB1 SELECT DEREF(address) FROM customer_addresses; DEREF(ADDRESS)(STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID) -------------------------------------------------------------------------------- CUST_ADDRESS_TYP('1 First', 'G45 EU8', 'Paris', 'CA', 'US')
DUMP
は、expr
のデータ型コード、長さ(バイト単位)および内部表現を含むVARCHAR2
値を戻します。戻される結果は、常にデータベース・キャラクタ・セットの文字です。各コードに対応するデータ型については、表2-1「組込みデータ型の概要」を参照してください。
引数return_fmt
には戻り値の書式として、次の値のいずれかを指定します。
return_fmt
17を指定したDUMP
の場合、特定の出力書式には依存しないでください。
デフォルトでは、戻り値にキャラクタ・セット情報が含まれません。expr
のキャラクタ・セット名を取り出すには、前述の書式のいずれかの値に1000を加えます。たとえば、return_fmt
に1008を指定すると、8進表記で結果が戻り、さらにexpr
のキャラクタ・セット名が得られます。
引数start_position
とlength
を組み合せて、内部表現の戻す部分を指定します。デフォルトでは、10進表記で全体の内部表現が戻されます。
expr
がNULLの場合はNULL
を戻します。
このファンクションは、CLOB
データを直接的にサポートしていません。ただし、暗黙的なデータ変換を使用してCLOB
を引数として渡すことはできます。
次の例では、文字列式および列からダンプ情報を抽出する方法を示します。
SELECT DUMP('abc', 1016) FROM DUAL; DUMP('ABC',1016) ------------------------------------------ Typ=96 Len=3 CharacterSet=WE8DEC: 61,62,63 SELECT DUMP(last_name, 8, 3, 2) "OCTAL" FROM employees WHERE last_name = 'Hunold' ORDER BY employee_id; OCTAL ------------------------------------------------------------------- Typ=1 Len=6: 156,157 SELECT DUMP(last_name, 10, 3, 2) "ASCII" FROM employees WHERE last_name = 'Hunold' ORDER BY employee_id; ASCII -------------------------------------------------------------------- Typ=1 Len=6: 110,111
EMPTY_BLOB
およびEMPTY_CLOB
は、LOB変数を初期化したり、INSERT
またはUPDATE
文でLOB列または属性をEMPTY
に初期化できる空のLOBロケータを戻します。EMPTY
とは、LOBは初期化されていても、データが移入されていない状態をいいます。
このファンクションから戻されるロケータは、DBMS_LOB
パッケージまたはOCIへのパラメータとして使用することはできません。
次の例では、サンプル表pm.print_media
のad_photo
列をEMPTY
に初期化します。
UPDATE print_media SET ad_photo = EMPTY_BLOB();
EXISTSNODE
は、指定されたパスを使用してXML文書をトラバースした後にノードが存在するかを判断します。XML文書、およびパスを指定するXPath文字列VARCHAR2
を含むXMLType
インスタンスを引数として指定します。オプションのnamespace_string
は、接頭辞のデフォルト・マッピングまたはネームスペース・マッピング(Oracle DatabaseがXPath式を評価する場合に使用)を指定するVARCHAR2
値に解決される必要があります。
namespace_string
引数のデフォルトは、ルート要素の名前空間になります。Xpath_string
のサブ要素を参照する場合は、namespace_string
を指定する必要があります。また、これらの引数の両方にwho接頭辞を指定する必要があります。
戻り値は、NUMBER
です。
次の例では、サンプル表oe.warehouses
のwarehouse_spec
列のXMLパスに/Warehouse/Dock
ノードが存在するかを判断します。
SELECT warehouse_id, warehouse_name FROM warehouses WHERE EXISTSNODE(warehouse_spec, '/Warehouse/Docks') = 1 ORDER BY warehouse_id, warehouse_name; WAREHOUSE_ID WAREHOUSE_NAME ------------ ----------------------------------- 1 Southlake, Texas 2 San Francisco 4 Seattle, Washington
EXP
は、e
をn
乗した値(e
= 2.71828183 ...)を戻します。このファンクションは、引数と同じ型の値を戻します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。引数がBINARY_FLOAT
の場合、このファンクションはBINARY_DOUBLE
を戻します。それ以外の場合、引数と同じ数値データ型を戻します。
次の例では、e
を4乗した値を戻します。
SELECT EXP(4) "e to the 4th power" FROM DUAL; e to the 4th power ------------------ 54.59815
EXTRACT
は、日時式または期間式から、指定された日時フィールドの値を抽出して戻します。expr
には、要求されたフィールドと互換性のある日時または期間データ型に評価される任意の式を指定できます。
YEAR
またはMONTH
が要求された場合、expr
はデータ型DATE
、TIMESTAMP
、TIMESTAMP
WITH
TIME
ZONE
、TIMESTAMP
WITH
LOCAL
TIME
ZONE
またはINTERVAL
YEAR
TO
MONTH
の式に評価される必要があります。
DAY
が要求された場合、expr
はデータ型DATE
、TIMESTAMP
、TIMESTAMP
WITH
TIME
ZONE
、TIMESTAMP
WITH
LOCAL
TIME
ZONE
またはINTERVAL
DAY
TO
SECOND
の式に評価される必要があります。
HOUR
、MINUTE
またはSECOND
が要求された場合、expr
はデータ型TIMESTAMP
、TIMESTAMP
WITH
TIME
ZONE
、TIMESTAMP
WITH
LOCAL
TIME
ZONE
またはINTERVAL
DAY
TO
SECOND
の式に評価される必要があります。DATE
は、Oracle Databaseによって時刻フィールドを持たないANSI DATE
データ型として処理されるため、ここでは有効ではありません。
TIMEZONE_HOUR
、TIMEZONE_MINUTE
、TIMEZONE_ABBR
、TIMEZONE_REGION
またはTIMEZONE_OFFSET
が要求された場合、expr
はデータ型TIMESTAMP
WITH
TIME
ZONE
またはTIMESTAMP
WITH
LOCAL
TIME
ZONE
の式に評価される必要があります。
EXTRACT
は、expr
をANSI日時データ型として解釈します。たとえば、EXTRACT
はDATE
をレガシーOracle DATE
ではなく、時刻要素を持たないANSI DATE
として処理します。したがって、DATE
値からは、YEAR
、MONTH
およびDAY
のみを抽出できます。同様に、TIMESTAMP
WITH
TIME
ZONE
データ型からは、TIMEZONE_HOUR
およびTIMEZONE_MINUTE
のみを抽出できます。
TIMEZONE_REGION
を抽出する場合、戻り値は、適切なタイムゾーン名を含む文字列です。また、TIMEZONE_ABBR
(略称)を抽出する場合、戻り値は、適切な略称を含む文字列です。その他の値を抽出する場合、戻り値はグレゴリオ暦での日時値を表す整数です。タイムゾーン値を持つ日時から抽出する場合、戻り値はUTCです。有効なタイムゾーン名およびそれに対する略称を表示するには、V$TIMEZONE_NAMES
動的パフォーマンス・ビューに問合せを実行してください。
このファンクションは、次に示す最初の例のように、非常に大規模な表の日時フィールド値を操作する場合に特に有効です。
日時フィールドと日時または期間値の式を組み合せると、あいまいな結果になる場合があります。この場合、Oracle Databaseは、UNKNOWN
を戻します(詳細は、次の例を参照してください)。
参照:
|
次の例では、oe.orders
表から、各月の注文数を戻します。
SELECT EXTRACT(month FROM order_date) "Month", COUNT(order_date) "No. of Orders" FROM orders GROUP BY EXTRACT(month FROM order_date) ORDER BY "No. of Orders" DESC; Month No. of Orders ---------- ------------- 11 15 7 14 6 14 3 11 5 10 9 9 2 9 8 7 10 6 1 5 12 4 4 1 12 rows selected.
次の例では、1998年を戻します。
SELECT EXTRACT(YEAR FROM DATE '1998-03-07') FROM DUAL; EXTRACT(YEARFROMDATE'1998-03-07') --------------------------------- 1998
次の例では、サンプル表hr.employees
から、1998以降に雇用されたすべての従業員を選択します。
SELECT last_name, employee_id, hire_date FROM employees WHERE EXTRACT(YEAR FROM TO_DATE(hire_date, 'DD-MON-RR')) > 1998 ORDER BY hire_date; LAST_NAME EMPLOYEE_ID HIRE_DATE ------------------------- ----------- --------- Landry 127 14-JAN-99 Lorentz 107 07-FEB-99 Cabrio 187 07-FEB-99 . . .
次の例では、結果があいまいになるため、OracleはUNKNOWN
を戻します。
SELECT EXTRACT(TIMEZONE_REGION FROM TIMESTAMP '1999-01-01 10:00:00 -08:00') FROM DUAL; EXTRACT(TIMEZONE_REGIONFROMTIMESTAMP'1999-01-0110:00:00-08:00') ---------------------------------------------------------------- UNKNOWN
タイムゾーン数値オフセットが式に指定され、その数値オフセットが複数のタイムゾーン地域をマップする場合、結果があいまいになります。
EXTRACT
(XML)は、EXISTSNODE
ファンクションに似ています。VARCHAR2
のXPath文字列を適用し、XMLのフラグメントを含むXMLType
インスタンスを戻します。先頭にスラッシュを付けて絶対XPath_string
を指定したり、先頭のスラッシュを省略して相対XPath_string
を指定できます。先頭のスラッシュを省略した場合、相対パスのコンテキストは、デフォルトでルート・ノードに設定されます。処理しているXMLでネームスペース接頭辞が使用される場合、オプションのnamespace_string
が必要です。この引数は、接頭辞のデフォルト・マッピングまたはネームスペース・マッピング(Oracle DatabaseがXPath式を評価する場合に使用)を指定するVARCHAR2
値に解決される必要があります。
次の例では、サンプル表oe.warehouses
のwarehouse_spec
列のXMLパスの/Warehouse/Dock
ノードの値を抽出します。
SELECT warehouse_name, EXTRACT(warehouse_spec, '/Warehouse/Docks') "Number of Docks" FROM warehouses WHERE warehouse_spec IS NOT NULL ORDER BY warehouse_name, "Number of Docks"; WAREHOUSE_NAME Number of Docks ------------------------- ------------------------- New Jersey San Francisco <Docks>1</Docks> Seattle, Washington <Docks>3</Docks> Southlake, Texas <Docks>2</Docks>
この例と、XMLのフラグメントのスカラー値を戻す、「EXTRACTVALUE」の例を比較してみてください。
EXTRACTVALUE
は、引数としてXMLType
インスタンスとXPath式を取り、結果として得られるノードのスカラー値を戻します。結果はシングルノードであり、テキスト・ノード、属性または要素のいずれかである必要があります。結果が要素である場合、その要素はシングル・テキスト・ノードを子ノードとして持つ必要があり、このファンクションが戻す値は、その子ノードの値になります。先頭にスラッシュを付けて絶対XPath_string
を指定したり、先頭のスラッシュを省略して相対XPath_string
を指定できます。先頭のスラッシュを省略した場合、相対パスのコンテキストは、デフォルトでルート・ノードに設定されます。
指定されたXPathが複数の子ノードを持つノードを指す場合、または指されたノードが非テキスト・ノードの子を持つ場合は、エラーが戻されます。オプションのnamespace_string
は、接頭辞のデフォルト・マッピングまたはネームスペース・マッピング(OracleがXPath式を評価する場合に使用)を指定するVARCHAR2
値に解決される必要があります。
XML Schemaに基づくドキュメントで戻り値の型が推測できる場合は、適切な型のスカラー値が戻ります。その他の場合は、VARCHAR2
型の結果が戻ります。XML Schemaに基づかないドキュメントの場合、戻り値は常にVARCHAR2
です。
次の例では、入力として、「EXTRACT(XML)」の例と同じ引数を取ります。このファンクションは、EXTRACT
ファンクションとは異なり、XMLのフラグメントを戻すのではなく、XMLのフラグメントのスカラー値を戻します。
SELECT warehouse_name, EXTRACTVALUE(e.warehouse_spec, '/Warehouse/Docks') "Docks" FROM warehouses e WHERE warehouse_spec IS NOT NULL; WAREHOUSE_NAME Docks -------------------- ------------ Southlake, Texas 2 San Francisco 1 New Jersey Seattle, Washington 3
このファンクションは、DBMS_DATA_MINING
パッケージまたはOracle Data Mining Java APIを使用して作成した特徴抽出モデルで使用するためのものです。このファンクションは、行内で最も高い数値を持つ特徴の識別子をOracleのNUMBER
で戻します。
mining_attribute_clause
は、PREDICTION
ファンクションと同様に動作します。詳細は、「mining_attribute_clause」を参照してください。
次の例では、データセット内の特徴と、それに対応する顧客の件数を示します。
この例と前提条件のデータ・マイニング操作(nmf_sh_sample
モデルおよびnmf_sh_sample_apply_prepared
ビューの作成など)は、デモ・ファイル$ORACLE_HOME/rdbms/demo/dmnmdemo.sql
で確認できます。データ・マイニングのデモ・ファイルの一般情報は、『Oracle Data Mining管理者ガイド』を参照してください。次に、このファンクションの構文の使用例を示します。
SELECT FEATURE_ID(nmf_sh_sample USING *) AS feat, COUNT(*) AS cnt FROM nmf_sh_sample_apply_prepared GROUP BY FEATURE_ID(nmf_sh_sample USING *) ORDER BY cnt DESC; FEAT CNT ---------- ---------- 7 1443 2 49 3 6 1 1 6 1
このファンクションは、DBMS_DATA_MINING
パッケージまたはOracle Data Mining Java APIを使用して作成した特徴抽出モデルで使用するためのものです。このファンクションは、有効な特徴を含むオブジェクトのVARRAYを戻します。VARRAYの各オブジェクトは、特徴IDと特徴値を含むスカラー値の組です。オブジェクト・フィールドには、FEATURE_ID
とVALUE
の名前が付き、両方ともOracleのNUMBER
になります。
オプションのtopN
引数は、特徴セットを上位N
の値のいずれかを持つ特徴セットに制限する正の整数です。N
番目の値に同順位がある場合でも、N
個の値のみが戻されます。この引数を指定しない場合、このファンクションはすべての特徴を戻します。
オプションのcutoff
引数は、戻される特徴を、指定したカットオフ以上の特徴値を持つ特徴のみに制限します。cutoff
のみをフィルタ処理するには、NULL
をtopN
に指定し、必要なカットオフ値をcutoff
に指定します。
mining_attribute_clause
は、PREDICTION
ファンクションと同様に動作します。詳細は、「mining_attribute_clause」を参照してください。
次の例では、指定した顧客レコードに対応する上位の特徴を示し(一致する品質を基準)、各特徴に上位の属性を決定します(0.25を超える係数を基準)。
この例と前提条件のデータ・マイニング操作(モデル、ビューおよび型の作成など)は、デモ・ファイル$ORACLE_HOME/rdbms/demo/dmkmdemo.sql
で確認できます。データ・マイニングのデモ・ファイルの一般情報は、『Oracle Data Mining管理者ガイド』を参照してください。次に、このファンクションの構文の使用例を示します。
WITH feat_tab AS ( SELECT F.feature_id fid, A.attribute_name attr, TO_CHAR(A.attribute_value) val, A.coefficient coeff FROM TABLE(DBMS_DATA_MINING.GET_MODEL_DETAILS_NMF('nmf_sh_sample')) F, TABLE(F.attribute_set) A WHERE A.coefficient > 0.25 ), feat AS ( SELECT fid, CAST(COLLECT(Featattr(attr, val, coeff)) AS Featattrs) f_attrs FROM feat_tab GROUP BY fid ), cust_10_features AS ( SELECT T.cust_id, S.feature_id, S.value FROM (SELECT cust_id, FEATURE_SET(nmf_sh_sample, 10 USING *) pset FROM nmf_sh_sample_apply_prepared WHERE cust_id = 100002) T, TABLE(T.pset) S ) SELECT A.value, A.feature_id fid, B.attr, B.val, B.coeff FROM cust_10_features A, (SELECT T.fid, F.* FROM feat T, TABLE(T.f_attrs) F) B WHERE A.feature_id = B.fid ORDER BY A.value DESC, A.feature_id ASC, coeff DESC, attr ASC, val ASC; VALUE FID ATTR VAL COEFF -------- ---- ------------------------- -------------------- ------- 6.8409 7 YRS_RESIDENCE 1.3879 6.8409 7 BOOKKEEPING_APPLICATION .4388 6.8409 7 CUST_GENDER M .2956 6.8409 7 COUNTRY_NAME United States of Ame .2848 rica 6.4975 3 YRS_RESIDENCE 1.2668 6.4975 3 BOOKKEEPING_APPLICATION .3465 6.4975 3 COUNTRY_NAME United States of Ame .2927 rica 6.4886 2 YRS_RESIDENCE 1.3285 6.4886 2 CUST_GENDER M .2819 6.4886 2 PRINTER_SUPPLIES .2704 6.3953 4 YRS_RESIDENCE 1.2931 5.9640 6 YRS_RESIDENCE 1.1585 5.9640 6 HOME_THEATER_PACKAGE .2576 5.2424 5 YRS_RESIDENCE 1.0067 2.4714 8 YRS_RESIDENCE .3297 2.3559 1 YRS_RESIDENCE .2768 2.3559 1 FLAT_PANEL_MONITOR .2593 17 rows selected.
このファンクションは、DBMS_DATA_MINING
パッケージまたはOracle Data Mining Java APIを使用して作成した特徴抽出モデルで使用するためのものです。このファンクションは、指定した特徴の値を戻します。feature_id
引数を指定しない場合、このファンクションは最も高い特徴値を戻します。この形式とFEATURE_ID
ファンクションを組み合せて使用すると、特徴と値の最大の組合せを取得できます。
mining_attribute_clause
は、PREDICTION
ファンクションと同様に動作します。詳細は、「mining_attribute_clause」を参照してください。
次の例では、特徴3に対応する顧客を、一致する品質の順序で示します。
この例と前提条件のデータ・マイニング操作(モデルおよびビューの作成など)は、デモ・ファイル$ORACLE_HOME/rdbms/demo/dmkmdemo.sql
で確認できます。データ・マイニングのデモ・ファイルの一般情報は、『Oracle Data Mining管理者ガイド』を参照してください。次に、このファンクションの構文の使用例を示します。
SELECT * FROM (SELECT cust_id, FEATURE_VALUE(nmf_sh_sample, 3 USING *) match_quality FROM nmf_sh_sample_apply_prepared ORDER BY match_quality DESC) WHERE ROWNUM < 11; CUST_ID MATCH_QUALITY ---------- ------------- 100210 19.4101627 100962 15.2482251 101151 14.5685197 101499 14.4186292 100363 14.4037396 100372 14.3335148 100982 14.1716545 101039 14.1079914 100759 14.0913761 100953 14.0799737 10 rows selected.
FIRST
ファンクションとLAST
ファンクションは類似しています。両方のファンクションとも、与えられたソート指定に対して、FIRST
またはLAST
としてランク付けされた一連の行の一連の値を操作する集計ファンクションおよび分析ファンクションです。1つの行のみがFIRST
またはLAST
としてランク付けされている場合、集計は、1つの要素のみを持つセットを操作します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。また、引数の数値データ型と同じデータ型を戻します。
ソートされたグループの最初または最後の行の値が必要であり、その値がソート・キーでない場合、FIRST
およびLAST
ファンクションは、自己結合またはビューの必要性を排除し、パフォーマンスを向上させます。
aggregate_function
は、MIN
、MAX
、SUM
、AVG
、COUNT
、VARIANCE
またはSTDDEV
ファンクションのいずれかです。FIRST
またはLAST
のいずれかにランク付けされた行の値を操作します。1つの行のみがFIRST
またはLAST
としてランク付けされている場合、集計は、単一(集計ではない)のセットを操作します。
KEEP
キーワードはセマンティクスを明確にするためのものです。これはaggregate_function
を修飾し、戻されるaggregate_function
の値がFIRST
またはLAST
のみであることを示します。
DENSE_RANK
FIRST
またはDENSE_RANK
LAST
は、最小(FIRST
)または最大(LAST
)稠密ランク(「オリンピック・ランク」)を持つ行のみを集計することを示します。
OVER
句を指定すると、FIRST
およびLAST
ファンクションを分析ファンクションとして使用できます。OVER
句のうち、query_partitioning_clause
の部分のみがこれらのファンクションで有効です。
次の例では、サンプル表hr.employees
の各部門で、歩合が最低である従業員の中での最低給与、および歩合が最高の従業員の中での最高給与を戻します。
SELECT department_id, MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct) "Worst", MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct) "Best" FROM employees GROUP BY department_id ORDER BY department_id, "Worst", "Best"; DEPARTMENT_ID Worst Best ------------- ---------- ---------- 10 4400 4400 20 6000 13000 30 2500 11000 40 6500 6500 50 2100 8200 60 4200 9000 70 10000 10000 80 6100 14000 90 17000 24000 100 6900 12000 110 8300 12000 7000 7000
次の例では、前述の例と同じ計算をしますが、当該部門の各従業員の結果を戻します。
SELECT last_name, department_id, salary, MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct) OVER (PARTITION BY department_id) "Worst", MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct) OVER (PARTITION BY department_id) "Best" FROM employees ORDER BY department_id, salary; LAST_NAME DEPARTMENT_ID SALARY Worst Best ------------------- ------------- ---------- ---------- ---------- Whalen 10 4400 4400 4400 Fay 20 6000 6000 13000 Hartstein 20 13000 6000 13000 . . . Gietz 110 8300 8300 12000 Higgins 110 12000 8300 12000 Grant 7000 7000 7000
FIRST_VALUE
は分析ファンクションです。これは、順序付けられた値の集合にある最初の値を戻します。集合内の最初の値がNULLの場合、IGNORE NULLS
を指定していないかぎり、ファンクションはNULL
を戻します。この設定は、データの稠密化に役立ちます。IGNORE NULLS
を指定すると、FIRST_VALUE
は集合内の最初のNULLではない値を戻します。すべての値がNULLの場合はNULL
を戻します。データの稠密化の例は、「パーティション化された外部結合の使用例:」を参照してください。
expr
には、FIRST_VALUE
または他の分析ファンクションを使用して分析ファンクションをネストできません。ただし、他の組込みファンクション式をexpr
で使用できます。expr
の書式の詳細は、「SQL式」を参照してください。
次の例では、部門90の各従業員について、その部門で給与が一番少ない従業員の名前を選択します。
SELECT department_id, last_name, salary, FIRST_VALUE(last_name) OVER (ORDER BY salary ASC ROWS UNBOUNDED PRECEDING) AS lowest_sal FROM (SELECT * FROM employees WHERE department_id = 90 ORDER BY employee_id) ORDER BY department_id, last_name, salary, lowest_sal; DEPARTMENT_ID LAST_NAME SALARY LOWEST_SAL ------------- ------------------------- ---------- ------------------------- 90 De Haan 17000 Kochhar 90 King 24000 Kochhar 90 Kochhar 17000 Kochhar
例では、FIRST_VALUE
ファンクションの非決定的な性質が示されています。KochharとDe Haanの給与は同じであるため、Kochharの次の行にDe Haanがあります。Kochharが最初に表示されているのは、副問合せが戻す行がemployee_id
で順序付けられているためです。ただし、副問合せが戻す行がemployee_id
で降順に順序付けられている場合は、次の例に示すとおり、ファンクションは異なる値を戻します。
SELECT department_id, last_name, salary, FIRST_VALUE(last_name) OVER (ORDER BY salary ASC ROWS UNBOUNDED PRECEDING) as fv FROM (SELECT * FROM employees WHERE department_id = 90 ORDER by employee_id DESC) ORDER BY department_id, last_name, salary, fv; DEPARTMENT_ID LAST_NAME SALARY FV ------------- ------------------------- ---------- ------------------------- 90 De Haan 17000 De Haan 90 King 24000 De Haan 90 Kochhar 17000 De Haan
次の例では、一意キーで順序付けることによって、FIRST_VALUE
ファンクションを決定的にする方法を示します。
SELECT department_id, last_name, salary, hire_date, FIRST_VALUE(last_name) OVER (ORDER BY salary ASC, hire_date ROWS UNBOUNDED PRECEDING) AS fv FROM (SELECT * FROM employees WHERE department_id = 90 ORDER BY employee_id DESC) ORDER BY department_id, last_name, salary, hire_date; DEPARTMENT_ID LAST_NAME SALARY HIRE_DATE FV ------------- --------------- ---------- --------- ------------------------- 90 De Haan 17000 13-JAN-93 Kochhar 90 King 24000 17-JUN-87 Kochhar 90 Kochhar 17000 21-SEP-89 Kochhar
FLOOR
はn
以下の最大整数を戻します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。また、引数の数値データ型と同じデータ型を戻します。
次の例では、15.7以下である最大の整数を戻します。
SELECT FLOOR(15.7) "Floor" FROM DUAL; Floor ---------- 15
FROM_TZ
ファンクションは、タイムスタンプ値およびタイムゾーンをTIMESTAMP
WITH
TIME
ZONE
値に変換します。time_zone_value
は、'TZH:TZM'
書式の文字列、またはオプションのTZD
書式を持つTZR
書式で文字列を戻す文字式です。
次の例では、タイムスタンプ値をTIMESTAMP
WITH
TIME
ZONE
に戻します。
SELECT FROM_TZ(TIMESTAMP '2000-03-28 08:00:00', '3:00') FROM DUAL; FROM_TZ(TIMESTAMP'2000-03-2808:00:00','3:00') --------------------------------------------------------------- 28-MAR-00 08.00.00 AM +03:00
GREATEST
は、1つ以上の式のリストの最大値を戻します。Oracle Databaseは、最初のexpr
を使用して戻り型を判断します。最初のexpr
が数値である場合、Oracleは、数値の優先順位が最も高い引数を判断し、比較の前に残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。最初のexpr
が数値ではない場合、比較の前に、2番目以降の各expr
が最初のexpr
のデータ型に暗黙的に変換されます。
Oracle Databaseは、非空白埋め比較セマンティクスを使用して各expr
を比較します。比較では、デフォルトの場合はバイナリが使用され、NLS_COMP
パラメータがLINGUISTIC
に設定され、NLS_SORT
パラメータにBINARY
以外の設定がある場合は言語が使用されます。文字の比較は、データベース・キャラクタ・セットの文字の数値コードに基づいて行われます。また、文字ごとではなく、一連のバイトとして扱われる文字列全体で行われます。このファンクションによって戻される値が文字データの場合、そのデータ型は、最初のexpr
が文字データ型の場合はVARCHAR2
、最初のexpr
が各国語キャラクタ・データ型の場合はNVARCHAR2
になります。
参照:
|
次の文では、最大値を持つ文字列を検索します。
SELECT GREATEST ('HARRY', 'HARRIOT', 'HAROLD') "Greatest" FROM DUAL; Greatest -------- HARRY
GROUP_ID
は、GROUP
BY
指定の結果から、重複するグループを識別します。このファンクションは、問合せ結果から重複グループを除外する場合に有効です。このファンクションは、重複グループを一意に識別するために、OracleのNUMBER
値を戻します。このファンクションは、1つのGROUP
BY
句を含むSELECT
文のみに適用できます。
特定のグループ化でn
個の重複が存在する場合、GROUP_ID
は0〜n
-1の範囲の数値を戻します。
次の例では、サンプル表sh.countries
およびsh.sales
の問合せの結果、重複するco.country_region
グループ化に値1
を割り当てます。
SELECT co.country_region, co.country_subregion, SUM(s.amount_sold) "Revenue", GROUP_ID() g FROM sales s, customers c, countries co WHERE s.cust_id = c.cust_id AND c.country_id = co.country_id AND s.time_id = '1-JAN-00' AND co.country_region IN ('Americas', 'Europe') GROUP BY co.country_region, ROLLUP (co.country_region, co.country_subregion) ORDER BY co.country_region, co.country_subregion, "Revenue", g; COUNTRY_REGION COUNTRY_SUBREGION Revenue G -------------------- ------------------------------ ---------- ---------- Americas Northern America 944.6 0 Americas 944.6 0 Americas 944.6 1 Europe Western Europe 566.39 0 Europe 566.39 0 Europe 566.39 1
GROUP_ID
が1より小さい行のみを戻すには、文の最後に次のHAVING
句を追加します。
HAVING GROUP_ID() < 1
GROUPING
は、通常のグループ化された行と超集合行を区別します。ROLLUP
やCUBE
などのGROUP
BY
の拡張機能は、すべての値の集合がNULLで表される超集合行を生成します。GROUPING
ファンクションを使用すると、通常の行に含まれるNULLと超集合行ですべての値の集合を表すNULLを区別できます。
GROUPING
ファンクションのexpr
は、GROUP
BY
句の式のいずれかと一致する必要があります。行のexpr
の値がすべての値の集合を表すNULLの場合、このファンクションは1の値を戻します。それ以外の場合は、0(ゼロ)を戻します。GROUPING
ファンクションは、OracleのNUMBER
値を戻します。これらの用語の詳細は、「SELECT
」の「group_by_clause」を参照してください。
次の例では、サンプル表hr.departments
およびhr.employees
で、GROUPING
ファンクションが1(表の通常の行ではなく超集合行)を戻す場合、それ以外の場合に表示されるNULLのかわりに、文字列「All Jobs」が「JOB」列に表示されます。
SELECT DECODE(GROUPING(department_name), 1, 'All Departments', department_name) AS department, DECODE(GROUPING(job_id), 1, 'All Jobs', job_id) AS job, COUNT(*) "Total Empl", AVG(salary) * 12 "Average Sal" FROM employees e, departments d WHERE d.department_id = e.department_id GROUP BY ROLLUP (department_name, job_id) ORDER BY department, job, "Total Empl", "Average Sal"; DEPARTMENT JOB Total Empl Average Sal ------------------------------ ---------- ---------- ----------- Accounting AC_ACCOUNT 1 99600 Accounting AC_MGR 1 144000 Accounting All Jobs 2 121800 Administration AD_ASST 1 52800 Administration All Jobs 1 52800 All Departments All Jobs 106 77479.2453 Executive AD_PRES 1 288000 Executive AD_VP 2 204000 Executive All Jobs 3 232000 Finance All Jobs 6 103200 Finance FI_ACCOUNT 5 95040 . . .
GROUPING_ID
は、行に関連するGROUPING
ビット・ベクトルに対応する数値を戻します。GROUPING_ID
は、ROLLUP
やCUBE
など、GROUP
BY
の拡張機能およびGROUPING
ファンクションを含むSELECT
文にのみ適用できます。多くのGROUP
BY
式を含む問合せでは、多くのGROUPING
ファンクションを必要とする特定の行のGROUP
BY
レベルを指定するため、非常に複雑なSQLになります。GROUPING_ID
は、このような場合に有効です。
GROUPING_ID
は、複数のGROUPING
ファンクションの結果をビット・ベクトル(1と0を組み合せた文字列)に連結したものと同じです。GROUPING_ID
を使用すると、複数のGROUPING
ファンクションを使用する必要がなくなり、行のフィルタ条件の表記が簡単になります。GROUPING_ID
を使用すると、要求する行が単一の条件(GROUPING_ID
= n
)によって識別されるため、行のフィルタ処理が簡単になります。このファンクションは、1つの表に複数のレベルの集計を格納する場合に、特に有効です。
次の例では、サンプル表sh.sales
の問合せからグループ化IDを抽出する方法を示します。
SELECT channel_id, promo_id, sum(amount_sold) s_sales, GROUPING(channel_id) gc, GROUPING(promo_id) gp, GROUPING_ID(channel_id, promo_id) gcp, GROUPING_ID(promo_id, channel_id) gpc FROM sales WHERE promo_id > 496 GROUP BY CUBE(channel_id, promo_id) ORDER BY channel_id, promo_id, s_sales, gc; CHANNEL_ID PROMO_ID S_SALES GC GP GCP GPC ---------- ---------- ---------- ---------- ---------- ---------- ---------- 2 999 25797563.2 0 0 0 0 2 25797563.2 0 1 1 2 3 999 55336945.1 0 0 0 0 3 55336945.1 0 1 1 2 4 999 13370012.5 0 0 0 0 4 13370012.5 0 1 1 2 999 94504520.8 1 0 2 1 94504520.8 1 1 3 3
HEXTORAW
は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
キャラクタ・セットで16進数を含むchar
をRAW値に変換します。
このファンクションは、CLOB
データを直接的にサポートしていません。ただし、暗黙的なデータ変換を使用してCLOB
を引数として渡すことはできます。
次の例では、RAW列を含む簡単な表を作成し、RAW
に変換された16進数値を挿入します。
CREATE TABLE test (raw_col RAW(10)); INSERT INTO test VALUES (HEXTORAW('7D'));
INITCAP
は、各単語の最初の文字を大文字、残りの文字を小文字にしてchar
を戻します。単語は空白または英数字以外の文字で区切ります。
char
は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
データ型です。戻り値は、char
と同じデータ型です。データベースは、基礎となるキャラクタ・セットに対して定義したバイナリ・マッピングに基づいて先頭文字の形式を設定します。大文字と小文字の区別については、「NLS_INITCAP」を参照してください。
このファンクションは、CLOB
データを直接的にサポートしていません。ただし、暗黙的なデータ変換を使用してCLOB
を引数として渡すことはできます。
次の例では、文字列にある各単語を大文字で始めます。
SELECT INITCAP('the soap') "Capitals" FROM DUAL; Capitals --------- The Soap
INSERTCHILDXML
は、ユーザー指定の値を、XPath式で指定したノードのターゲットXMLに挿入します。このファンクションと「INSERTXMLBEFORE」を比較してください。
XMLType_instance
は、XMLType
のインスタンスです。
XPath_string
は、1つ以上の子ノードが挿入されるノードを1つ以上示すXPath式です。先頭にスラッシュを付けて絶対XPath_string
を指定したり、先頭のスラッシュを省略して相対XPath_string
を指定できます。先頭のスラッシュを省略した場合、相対パスのコンテキストは、デフォルトでルート・ノードに設定されます。
child_expr
は、挿入する要素または属性のノードを1つ以上指定します。
value_expr
は、挿入されるノードを1つ以上指定するXMLType
のフラグメントです。これは文字列に変換する必要があります。
namespace_string
は、XPath_string
のネームスペース情報を提供します。このパラメータは、VARCHAR2
型である必要があります。
次の例では、2番目の/Owner
ノードを、「APPENDCHILDXML」の例で更新したウェアハウスの1つのwarehouse_spec
に追加します。
UPDATE warehouses SET warehouse_spec = INSERTCHILDXML(warehouse_spec, '/Warehouse/Building', 'Owner', XMLType('<Owner>LesserCo</Owner>')) WHERE warehouse_id = 3; SELECT warehouse_spec FROM warehouses WHERE warehouse_id = 3; WAREHOUSE_SPEC ---------------------------------------------------------------------------- <?xml version="1.0"?> <Warehouse> <Building>Rented <Owner>Grandco</Owner> <Owner>LesserCo</Owner> </Building> <Area>85700</Area> <DockType/> <WaterAccess>N</WaterAccess> <RailAccess>N</RailAccess> <Parking>Street</Parking> <VClearance>11.5 ft</VClearance> </Warehouse>
INSERTXMLCHILDAFTER
は、1つ以上のコレクション要素をターゲット親要素の子として挿入します。各ターゲットは、指定された既存のコレクション要素の直後に挿入されます。挿入の対象となる既存のXML文書は、スキーマベースまたは非スキーマベースにすることができます。
XMLType_instance
は、挿入の対象となるXMLデータを識別します。
XPath_string
は、対象データ内の親要素の位置を特定します。子データは、それぞれの親要素の下に挿入されます。
child_expr
は、挿入される子データの前に配置される既存の子の位置を指定する相対XPath 1.0式です。この式は、親XPathによって示された要素の子要素を指定する必要があります。また、条件を含むこともできます。
value_expr
は、挿入するXMLType
子要素データです。この引数の各トップレベル要素のノードは、child_exprによって示された要素と同じデータ型である必要があります。
namespace_string
は、親要素、既存の子要素および挿入される子要素XMLデータの名前空間を指定します。
このファンクション、その使用方法および例の詳細は、『Oracle XML DB開発者ガイド』を参照してください。
次の例は、INSERTCHILDXML
の例と似ていますが、この例では、INSERTCHILDXML
の例で追加された/Owner
ノードの後に、3番目の/Owner
ノードが追加されています。問合せの出力は読み取りやすいように整えられています。
UPDATE warehouses SET warehouse_spec = INSERTCHILDXMLAFTER(warehouse_spec, '/Warehouse/Building','Owner[2]', XMLType('<Owner>ThirdOwner</Owner>')) WHERE warehouse_id = 3; SELECT warehouse_name, EXTRACT(warehouse_spec, '/Warehouse/Building/Owner') "Owners" FROM warehouses WHERE warehouse_id = 3; WAREHOUSE_NAME Owners ----------------------------------- ------------------------------ New Jersey <Owner>LesserCo</Owner> <Owner>GrandCo</Owner> <Owner>ThirdOwner</Owner>
INSERTXMLCHILDBEFORE
は、1つ以上のコレクション要素をターゲット親要素の子として挿入します。各ターゲットは、指定された既存のコレクション要素の直前に挿入されます。挿入の対象となる既存のXML文書は、スキーマベースまたは非スキーマベースにすることができます。
XMLType_instance
は、挿入の対象となるXMLデータを識別します。
XPath_string
は、対象データ内の親要素の位置を特定します。子データは、それぞれの親要素の下に挿入されます。
child_expr
は、挿入される子データの後に配置される既存の子の位置を指定する相対XPath 1.0式です。この式は、親XPathによって示された要素の子要素を指定する必要があります。また、条件を含むこともできます。
value_expr
は、挿入するXMLType子要素データです。この引数の各トップレベル要素のノードは、child_exprによって示された要素と同じデータ型である必要があります。
namespace_string
は、親要素、既存の子要素および挿入される子要素XMLデータの名前空間を指定します。
このファンクション、その使用方法および例の詳細は、『Oracle XML DB開発者ガイド』を参照してください。
次の例は、INSERTCHILDXML
の例と似ていますが、この例では、INSERTCHILDXML
の例で追加された/Owner
ノードの前に、3番目の/Owner
ノードが追加されています。問合せの出力は読み取りやすいように整えられています。
UPDATE warehouses SET warehouse_spec = INSERTCHILDXMLBEFORE(warehouse_spec, '/Warehouse/Building','Owner[2]', XMLType('<Owner>ThirdOwner</Owner>')) WHERE warehouse_id = 3; SELECT warehouse_name, EXTRACT(warehouse_spec, '/Warehouse/Building/Owner') "Owners" FROM warehouses WHERE warehouse_id = 3; WAREHOUSE_NAME Owners ----------------------------------- ------------------------------ New Jersey <Owner>LesserCo</Owner> <Owner>ThirdOwner</Owner> <Owner>GrandCo</Owner>
INSERTXMLAFTER
は、属性のノードではないターゲット・ノードの直後に任意の種類の1つ以上のノードを挿入します。挿入の対象となるXML文書は、スキーマベースまたは非スキーマベースにすることができます。このファンクションはinsertXMLbeforeと似ていますが、ターゲット・ノードの前ではなく後に挿入します。
XMLType_instance
は、挿入のターゲット・ノードを指定します。
XPath_string
は、属性のノードを除く任意の0個以上のノードの位置をターゲット・ノード内で指定するXPath 1.0式です。XMLデータは、これらの各ノードの直後に挿入されます。つまり、指定された各ノードは、value_expr
で指定されたノードの前に配置される兄弟ノードとなります。
value_expr
は、挿入されるXMLデータです。任意の種類の1つ以上のノードを指定できます。ノードの順序は挿入後も保持されます。
namespace_string
は、ターゲット・ノードのネームスペースです。
このファンクション、その使用方法および例の詳細は、『Oracle XML DB開発者ガイド』を参照してください。
次の例は、INSERTCHILDXML
の例と似ていますが、この例では、INSERTCHILDXML
の例で追加された/Owner
ノードの後に、3番目の/Owner
ノードが追加されています。問合せの出力は読み取りやすいように整えられています。
UPDATE warehouses SET warehouse_spec = INSERTXMLAFTER(warehouse_spec, '/Warehouse/Building/Owner[1]', XMLType('<Owner>SecondOwner</Owner>')) WHERE warehouse_id = 3; SELECT warehouse_name, EXTRACT(warehouse_spec, '/Warehouse/Building/Owner') "Owners" FROM warehouses WHERE warehouse_id = 3;
INSERTXMLBEFORE
は、ユーザー指定の値を、XPath式で指定したノードの前のターゲットXMLに挿入します。 このファンクションはINSERTXMLAFTERと似ていますが、ターゲット・ノードの後ではなく前に挿入します。このファンクションと「INSERTCHILDXML」を比較してください。
XMLType_instance
は、XMLType
のインスタンスです。
XPath_string
は、1つ以上の子ノードが挿入されるノードを1つ以上示すXPath式です。先頭にスラッシュを付けて絶対XPath_string
を指定したり、先頭のスラッシュを省略して相対XPath_string
を指定できます。先頭のスラッシュを省略した場合、相対パスのコンテキストは、デフォルトでルート・ノードに設定されます。
value_expr
は、挿入される1つ以上のノードと親ノード内での位置を定義するXMLType
のフラグメントです。これは文字列に変換する必要があります。
namespace_string
は、XPath_string
のネームスペース情報を提供します。このパラメータは、VARCHAR2
型である必要があります。次の例は、「INSERTCHILDXML」の例と似ていますが、この例では、「INSERTCHILDXML」の例で追加した/Owner
ノードの前に、3番目の/Owner
ノードを追加します。問合せの出力は読み取りやすいように整えられています。
UPDATE warehouses SET warehouse_spec = INSERTXMLBEFORE(warehouse_spec, '/Warehouse/Building/Owner[2]', XMLType('<Owner>ThirdOwner</Owner>')) WHERE warehouse_id = 3; SELECT warehouse_name, EXTRACT(warehouse_spec, '/Warehouse/Building/Owner') "Owners" FROM warehouses WHERE warehouse_id = 3; Name Owners ------------ -------------------------------------------------------------------- New Jersey <Owner>Grandco</Owner> <Owner>ThirdOwner</Owner> <Owner>LesserCo</Owner>
INSTR
ファンクションは、string
のsubstring
を検索します。このファンクションは、最初に現れた文字string
の位置を示す整数を戻します。INSTR
は、入力キャラクタ・セットによって定義された文字を使用して、文字列を算出します。INSTRB
は、文字のかわりにバイトを使用します。INSTRC
は、完全なUnicodeキャラクタを使用します。INSTR2
は、UCS2コードポイントを使用します。INSTR4
は、UCS4コードポイントを使用します。
position
は、Oracle Databaseが検索を開始する文字string
の位置を示す0(ゼロ)以外の整数です。position
が負の場合、Oracleはstring
の終わりから逆方向にカウントし、結果位置から逆方向に検索します。
occurrence
は、検索するstring
が現れたことを示す整数です。occurrence
の値は正である必要があります。occurrence
が1より大きい場合、データベースでは、最初に出現するstring
の2番目の文字以降で2番目の出現を検索します。
string
およびsubstring
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。戻り値のデータ型はNUMBER
です。
position
およびoccurrence
は、NUMBER
データ型か、または暗黙的にNUMBER
に変換可能な任意のデータ型で、整数に変換されるものである必要があります。position
およびoccurrence
のデフォルト値は1です。この場合、Oracleはstring
の最初の文字から検索を開始します。検索対象はsubstring
が最初に現れる位置です。戻り値は、position
の値にかかわらず、string
の先頭に関係し、文字で表されます。検索が失敗した(string
のposition
番目の文字の後にsubstring
がoccurrence
回現れない)場合、戻り値は0となります。
次の例では、文字列CORPORATE
FLOOR
で文字列OR
の検索を3番目の文字から開始します。文字列CORPORATE
FLOOR
で2回目に現れる「OR
」の開始位置を戻します。
SELECT INSTR('CORPORATE FLOOR','OR', 3, 2) "Instring" FROM DUAL; Instring ---------- 14
次の例では、最後の文字から、最後から3番目の文字まで、つまりFLOOR
の最初のO
まで逆方向にカウントします。次に、2回目に現れる「OR」
を逆方向に検索し、2回目に現れるこの文字列が、検索文字列の2番目の文字で始まることを認識します。
SELECT INSTR('CORPORATE FLOOR','OR', -3, 2) "Reversed Instring" FROM DUAL; Reversed Instring ----------------- 2
次の例では、データベース・キャラクタ・セットがダブルバイトの場合を想定しています。
SELECT INSTRB('CORPORATE FLOOR','OR',5,2) "Instring in bytes" FROM DUAL; Instring in bytes ----------------- 27
ITERATION_NUMBER
ファンクションは、SELECT
文のmodel_clause
にのみ指定でき、model_rules_clause
にITERATE(
number
)
が指定されている場合にのみ使用できます。このファンクションは、モデル・ルールに従って完了した反復を示す整数を戻します。最初の反復では0(ゼロ)を戻します。2回目以降の各反復では、iteration_number
に1を足した整数を戻します。
次の例では、1998年および1999年のマウス・パッドの売上を、それぞれ2001年および2002年のマウス・パッドの売上に割り当てます。
SELECT country, prod, year, s FROM sales_view_ref MODEL PARTITION BY (country) DIMENSION BY (prod, year) MEASURES (sale s) IGNORE NAV UNIQUE DIMENSION RULES UPSERT SEQUENTIAL ORDER ITERATE(2) ( s['Mouse Pad', 2001 + ITERATION_NUMBER] = s['Mouse Pad', 1998 + ITERATION_NUMBER] ) ORDER BY country, prod, year; COUNTRY PROD YEAR S ---------- ----------------------------------- -------- --------- France Mouse Pad 1998 2509.42 France Mouse Pad 1999 3678.69 France Mouse Pad 2000 3000.72 France Mouse Pad 2001 2509.42 France Mouse Pad 2002 3678.69 France Standard Mouse 1998 2390.83 France Standard Mouse 1999 2280.45 France Standard Mouse 2000 1274.31 France Standard Mouse 2001 2164.54 Germany Mouse Pad 1998 5827.87 Germany Mouse Pad 1999 8346.44 Germany Mouse Pad 2000 7375.46 Germany Mouse Pad 2001 5827.87 Germany Mouse Pad 2002 8346.44 Germany Standard Mouse 1998 7116.11 Germany Standard Mouse 1999 6263.14 Germany Standard Mouse 2000 2637.31 Germany Standard Mouse 2001 6456.13 18 rows selected.
この例では、ビューsales_view_ref
が必要です。このビューを作成する方法については、「MODEL句の例:」を参照してください。
LAG
は分析ファンクションです。これは、自己結合せずに、表の1つ以上の行へ同時アクセスを行います。問合せから戻される一連の行およびカーソル位置を指定すると、LAG
は、その位置より前にある指定された物理オフセットにある行へアクセスします。
offset
を指定しない場合、デフォルト値は1です。オフセットがウィンドウの有効範囲を超えた場合、オプションのdefault
値が戻されます。default
を指定しない場合、デフォルトはNULLです。
value_expr
には、LAG
または他の分析ファンクションを使用して分析ファンクションをネストできません。ただし、他の組込みファンクション式をvalue_expr
で使用できます。
次の例では、employees
表の各販売員について、その販売員の直前に雇用された従業員の給与を示します。
SELECT last_name, hire_date, salary, LAG(salary, 1, 0) OVER (ORDER BY hire_date) AS prev_sal FROM employees WHERE job_id = 'PU_CLERK' ORDER BY last_name, hire_date, salary, prev_sal; LAST_NAME HIRE_DATE SALARY PREV_SAL ------------------------- --------- ---------- ---------- Baida 24-DEC-97 2900 2800 Colmenares 10-AUG-99 2500 2600 Himuro 15-NOV-98 2600 2900 Khoo 18-MAY-95 3100 0 Tobias 24-JUL-97 2800 3100
FIRST
ファンクションとLAST
ファンクションは類似しています。両方のファンクションとも、与えられたソート指定に対して、FIRST
またはLAST
としてランク付けされた一連の行の一連の値を操作する集計ファンクションおよび分析ファンクションです。1つの行のみがFIRST
またはLAST
としてランク付けされている場合、集計は、1つの要素のみを持つセットを操作します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。また、引数の数値データ型と同じデータ型を戻します。
このファンクションの詳細および使用例は、「FIRST」を参照してください。
LAST_DAY
は、date
を含む月の最終日の日付を戻します。月の最終日は、セッション・パラメータNLS_CALENDAR
によって定義されます。戻り型は、date
のデータ型に関係なく常にDATE
です。
次の文は、現在の月の残りの日数を確認します。
SELECT SYSDATE, LAST_DAY(SYSDATE) "Last", LAST_DAY(SYSDATE) - SYSDATE "Days Left" FROM DUAL; SYSDATE Last Days Left --------- --------- ---------- 30-MAY-01 31-MAY-01 1
次の例では、各従業員の雇用開始日に5
か月を加えて、評価日付を戻します。
SELECT last_name, hire_date, TO_CHAR( ADD_MONTHS(LAST_DAY(hire_date), 5)) "Eval Date" FROM employees; LAST_NAME HIRE_DATE Eval Date ------------------------- --------- --------- King 17-JUN-87 30-NOV-87 Kochhar 21-SEP-89 28-FEB-90 De Haan 13-JAN-93 30-JUN-93 Hunold 03-JAN-90 30-JUN-90 Ernst 21-MAY-91 31-OCT-91 Austin 25-JUN-97 30-NOV-97 Pataballa 05-FEB-98 31-JUL-98 Lorentz 07-FEB-99 31-JUL-99 . . .
LAST_VALUE
は分析ファンクションです。これは、順序付けられた値の集合にある最後の値を戻します。集合内の最後の値がNULLの場合、IGNORE
NULLS
を指定していないかぎり、ファンクションはNULL
を戻します。この設定は、データの稠密化に役立ちます。IGNORE NULLS
を指定すると、LAST_VALUE
は集合内の最初のNULLではない値を戻します。すべての値がNULLの場合はNULL
を戻します。データの稠密化の例は、「パーティション化された外部結合の使用例:」を参照してください。
expr
には、LAST_VALUE
または他の分析ファンクションを使用して分析ファンクションをネストできません。ただし、他の組込みファンクション式をexpr
で使用できます。expr
の書式の詳細は、「SQL式」を参照してください。
analytic_clause
のwindowing_clause
を省略した場合、デフォルトでRANGE
BETWEEN
UNBOUNDED
PRECEDING
AND
CURRENT
ROW
になります。ウィンドウの最後の値はウィンドウの下部にあり、修復されないため、このデフォルトは予期しない値を戻す場合があります。変更は、現行の行の変更として保持されます。正しい結果を得るには、windowing_clause
をRANGE
BETWEEN
UNBOUNDED
PRECEDING
AND
UNBOUNDED
FOLLOWING
として指定します。または、windowing_clause
をRANGE
BETWEEN
CURRENT
ROW
AND
UNBOUNDED
FOLLOWING
として指定することもできます。
次の例では、給与が一番高い従業員の雇用開始日を各行に戻します。
SELECT last_name, salary, hire_date, LAST_VALUE(hire_date) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS lv FROM (SELECT * FROM employees WHERE department_id = 90 ORDER BY hire_date) ORDER BY last_name, salary, hire_date, lv; LAST_NAME SALARY HIRE_DATE LV --------------- ---------- --------- --------- De Haan 17000 13-JAN-93 17-JUN-87 King 24000 17-JUN-87 17-JUN-87 Kochhar 17000 21-SEP-89 17-JUN-87
この例では、LAST_VALUE
ファンクションの非決定的な性質を示しています。KochharとDe Haanの給与は同じであるため、Kochharの次の行にDe Haanがあります。Kochharが最初に表示されているのは、副問合せの行がhire_date
で順序付けられているためです。ただし、行がhire_date
で降順に順序付けられている場合は、次の例に示すとおり、ファンクションは異なる値を戻します。
SELECT last_name, salary, hire_date, LAST_VALUE(hire_date) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS lv FROM (SELECT * FROM employees WHERE department_id = 90 ORDER BY hire_date DESC) ORDER BY last_name, salary, hire_datea, lv; LAST_NAME SALARY HIRE_DATE LV --------------- ---------- --------- --------- De Haan 17000 13-JAN-93 17-JUN-87 King 24000 17-JUN-87 17-JUN-87 Kochhar 17000 21-SEP-89 17-JUN-87
次の2つの例では、一意キーで順序付けることによって、LAST_VALUE
ファンクションを決定的にする方法を示しています。salary
およびhire_date
でファンクション内を順序付けると、副問合せの順序付けにかかわらず、同じ結果が戻されます。
SELECT last_name, salary, hire_date, LAST_VALUE(hire_date) OVER (ORDER BY salary, hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS lv FROM (SELECT * FROM employees WHERE department_id = 90 ORDER BY hire_date) ORDER BY last_name, salary, hire_date, lv; LAST_NAME SALARY HIRE_DATE LV --------------- ---------- --------- --------- De Haan 17000 13-JAN-93 17-JUN-87 King 24000 17-JUN-87 17-JUN-87 Kochhar 17000 21-SEP-89 17-JUN-87 SELECT last_name, salary, hire_date, LAST_VALUE(hire_date) OVER (ORDER BY salary, hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS lv FROM (SELECT * FROM employees WHERE department_id = 90 ORDER BY hire_date DESC) ORDER BY last_name, salary, hire_date, lv; LAST_NAME SALARY HIRE_DATE LV --------------- ---------- --------- --------- De Haan 17000 13-JAN-93 17-JUN-87 King 24000 17-JUN-87 17-JUN-87 Kochhar 17000 21-SEP-89 17-JUN-87
LEAD
は分析ファンクションです。これは、自己結合せずに、表の1つ以上の行へ同時アクセスを行います。問合せから戻される一連の行およびカーソル位置を指定すると、LEAD
は、その位置より後にある指定された物理オフセットの行へアクセスします。
offset
を指定しない場合、デフォルト値は1です。オフセットが表の有効範囲を超えた場合、オプションのdefault
値が戻されます。default
を指定しない場合、デフォルト値はNULLです。
value_expr
には、LEAD
または他の分析ファンクションを使用して分析ファンクションをネストできません。ただし、他の組込みファンクション式をvalue_expr
で使用できます。
次の例では、employees
表の各従業員について、その従業員の直後に雇用された従業員の雇用開始日を示します。
SELECT last_name, hire_date, LEAD(hire_date, 1) OVER (ORDER BY hire_date) AS "NextHired" FROM employees WHERE department_id = 30 ORDER BY last_name, hire_date, "NextHired"; LAST_NAME HIRE_DATE NextHired ------------------------- --------- --------- Baida 24-DEC-97 15-NOV-98 Colmenares 10-AUG-99 Himuro 15-NOV-98 10-AUG-99 Khoo 18-MAY-95 24-JUL-97 Raphaely 07-DEC-94 18-MAY-95 Tobias 24-JUL-97 24-DEC-97
LEAST
は、リストされたexpr
内の最小値を戻します。比較の前に、2番目以降のすべてのexpr
は最初のexpr
のデータ型に暗黙的に変換されます。Oracle Databaseは、非空白埋め比較セマンティクスを使用してexpr
を比較します。このファンクションによって戻される値が文字データの場合、そのデータ型は常にVARCHAR2
になります。
参照:
暗黙的な変換の詳細は、表2-10「暗黙的な型変換のマトリックス」を参照してください。2進浮動小数点の比較セマンティクスの詳細は、「浮動小数点数」を参照してください。「データ型の比較規則」も参照してください。 |
次の文では、最小値を持つ文字列を検索します。
SELECT LEAST('HARRY','HARRIOT','HAROLD') "LEAST" FROM DUAL; LEAST ------ HAROLD
LENGTH
の各ファンクションは、char
の長さを戻します。LENGTH
は、入力キャラクタ・セットによって定義された文字を使用して、長さを算出します。LENGTHB
は、文字のかわりにバイトを使用します。LENGTHC
は、完全なUnicodeキャラクタを使用します。LENGTH2
は、UCS2コードポイントを使用します。LENGTH4
は、UCS4コードポイントを使用します。
char
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。戻り値のデータ型はNUMBER
です。char
のデータ型がCHAR
の場合、その長さにはすべての後続空白が含まれます。char
がNULLの場合、このファンクションはNULLを戻します。
LENGTHB
ファンクションは、シングルバイトのLOBでのみサポートされます。このファンクションは、マルチバイトのキャラクタ・セットのCLOB
とNCLOB
では使用できません。
次の例では、シングルバイトおよびマルチバイトのデータベース・キャラクタ・セットを使用するLENGTH
ファンクションを使用します。
SELECT LENGTH('CANDIDE') "Length in characters" FROM DUAL; Length in characters -------------------- 7
次の例では、データベース・キャラクタ・セットがダブルバイトの場合を想定しています。
SELECT LENGTHB ('CANDIDE') "Length in bytes" FROM DUAL; Length in bytes --------------- 14
LN
は、n
の自然対数を戻します(n
は正の数)。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。引数がBINARY_FLOAT
の場合、このファンクションはBINARY_DOUBLE
を戻します。それ以外の場合、引数と同じ数値データ型を戻します。
次の例では、95の自然対数を戻します。
SELECT LN(95) "Natural log of 95" FROM DUAL; Natural log of 95 ----------------- 4.55387689
LNNVL
は、条件のオペランドの1つまたは両方がNULLの可能性がある場合にその条件を簡単に評価する方法を提供します。このファンクションは、問合せのWHERE
句でのみ使用できます。このファンクションは、引数として条件を取り、その条件がFALSE
またはUNKNOWN
の場合はTRUE
を戻し、TRUE
の場合はFALSE
を戻します。LNNVL
は、スカラー式を指定できる場所であればどこでも指定でき、有効ではないが、発生する可能性があるNULLを評価するためにIS
[NOT
] NULL
、AND
またはOR
条件が必要であるようなコンテキストでも指定できます。
Oracle Databaseは、LNNVL
ファンクションをこの方法で内部的に使用して、NOT
IN
条件をNOT
EXISTS
条件として書き換える場合があります。この場合、EXPLAIN
PLAN
からの出力によって、この操作がPLAN TABLEに出力されます。condition
では、どのようなスカラー値でも評価できますが、AND
、OR
またはBETWEEN
を含む複合条件は指定できません。
a
= 2およびb
=NULLの場合のLNNVL
からの戻り値を次の表に示します。
条件 | 条件の真偽 | LNNVLの戻り値 |
---|---|---|
a = 1 |
|
|
a = 2 |
|
|
a |
|
|
b = 1 |
|
|
b |
|
|
a = b |
|
|
歩合を受け取らない従業員を含めて、歩合率が20%未満の従業員数を調べるとします。次の問合せは、20%未満の歩合を実際に受け取る従業員のみを戻します。
SELECT COUNT(*) FROM employees WHERE commission_pct < .2; COUNT(*) ---------- 11
歩合を受け取らない72人の従業員も含めるには、LNNVL
ファンクションを次のように使用して、この問合せを書き換えます。
SELECT COUNT(*) FROM employees WHERE LNNVL(commission_pct >= .2); COUNT(*) ---------- 83
LOCALTIMESTAMP
は、セッションのタイムゾーンの現在の日付および時刻をTIMESTAMP
データ型の値で戻します。これに対して、CURRENT_TIMESTAMP
は、TIMESTAMP
WITH
TIME
ZONE
値を戻します。
オプションの引数timestamp_precision
には、戻される時刻値の秒の小数部の精度を指定します。
次の例では、LOCALTIMESTAMP
とCURRENT_TIMESTAMP
の相違を示します。
ALTER SESSION SET TIME_ZONE = '-5:00'; SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL; CURRENT_TIMESTAMP LOCALTIMESTAMP ------------------------------------------------------------------- 04-APR-00 01.27.18.999220 PM -05:00 04-APR-00 01.27.19 PM ALTER SESSION SET TIME_ZONE = '-8:00'; SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL; CURRENT_TIMESTAMP LOCALTIMESTAMP ----------------------------------- ------------------------------ 04-APR-00 10.27.45.132474 AM -08:00 04-APR-00 10.27.451 AM
LOCALTIMESTAMP
で書式マスクを使用する場合は、ファンクションが戻す値と書式マスクを一致させてください。たとえば、次の表の場合を考えます。
CREATE TABLE local_test (col1 TIMESTAMP WITH LOCAL TIME ZONE);
ファンクションが戻す型のTIME
ZONE
の部分がマスクに含まれていないため、次の文は正常に実行されません。
INSERT INTO local_test VALUES (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF'));
次の文では、LOCALTIMESTAMP
の戻り値の型と一致する正しい書式マスクが使用されています。
INSERT INTO local_test VALUES (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF PM'));
LOG
は、n2
を底とするn1
の対数を戻します。底n1
は0(ゼロ)または1以外の任意の正の値で、n2
は任意の正の値です。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。いずれかの引数がBINARY_FLOAT
またはBINARY_DOUBLE
の場合、このファンクションはBINARY_DOUBLE
を戻します。それ以外の場合、NUMBER
を戻します。
次の例では、100の対数を戻します。
SELECT LOG(10,100) "Log base 10 of 100" FROM DUAL; Log base 10 of 100 ------------------ 2
LOWER
は、すべての文字を小文字にしてchar
を戻します。char
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。戻り値は、char
と同じデータ型です。データベースは、基礎となるキャラクタ・セットに対して定義したバイナリ・マッピングに基づいて文字の形式を設定します。小文字の区別については、「NLS_LOWER」を参照してください。
次の例では、文字列を小文字にして戻します。
SELECT LOWER('MR. SCOTT MCMILLAN') "Lowercase" FROM DUAL; Lowercase -------------------- mr. scott mcmillan
LPAD
は、expr1
の左側にexpr2
に指定した文字を連続的に埋め込んでn
桁にして戻します。このファンクションは、問合せの出力の書式設定に役立ちます。
expr1
およびexpr2
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。戻される文字列は、expr1
が文字データ型の場合はVARCHAR2
データ型、expr1
が各国語キャラクタ・データ型の場合はNVARCHAR2
データ型、expr1
がLOBデータ型の場合はLOBデータ型になります。expr1
と同じキャラクタ・セットの文字列が戻されます。引数n
は、NUMBER
型の整数か、またはNUMBER
型の整数に暗黙的に変換可能な値である必要があります。
expr2
を指定しない場合、デフォルトで空白1個が指定されます。expr1
がn
より長い場合、このファンクションはn
に収まるexpr1
の一部を戻します。
引数n
は、戻り値が画面に表示される場合の全体の長さです。多くのキャラクタ・セットでは、これは戻り値の文字数でもあります。ただし、マルチバイトのキャラクタ・セットでは、表示される文字列の長さが文字列の文字数と異なる場合もあります。
次の例では、文字列の左側にアスタリスクとピリオド(*.)を埋め込みます。
SELECT LPAD('Page 1',15,'*.') "LPAD example" FROM DUAL; LPAD example --------------- *.*.*.*.*Page 1
LTRIM
は、char
の左端から、set
に指定されたすべての文字を削除します。set
を指定しない場合、デフォルトで空白1個が指定されます。char
が文字リテラルの場合、一重引用符で囲む必要があります。Oracle Databaseはchar
の先頭文字からスキャンし始め、set
に指定された文字をすべて削除します。set
に指定された文字以外の文字が見つかった時点で結果を戻します。
char
およびset
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。戻される文字列は、char
が文字データ型の場合はVARCHAR2
データ型、char
が各国語キャラクタデータ型の場合はNVARCHAR2
データ型、char
がLOBデータ型の場合はLOBデータ型になります。
次の例では、oe.products
表内の製品名のグループから、冗長な最初の語を削除します。
SELECT product_name, LTRIM(product_name, 'Monitor ') "Short Name" FROM products WHERE product_name LIKE 'Monitor%'; PRODUCT_NAME Short Name -------------------- --------------- Monitor 17/HR 17/HR Monitor 17/HR/F 17/HR/F Monitor 17/SD 17/SD Monitor 19/SD 19/SD Monitor 19/SD/M 19/SD/M Monitor 21/D 21/D Monitor 21/HR 21/HR Monitor 21/HR/M 21/HR/M Monitor 21/SD 21/SD Monitor Hinge - HD Hinge - HD Monitor Hinge - STD Hinge - STD
MAKE_REF
は、オブジェクト識別子が主キーに基づいている、オブジェクト・ビューの行またはオブジェクト表の行に対するREF
を作成します。このファンクションは、オブジェクト・ビューを作成する場合などに有効です。
サンプル・スキーマoe
には、inventory_typ
に基づくオブジェクト・ビューoc_inventories
が格納されています。オブジェクト識別子はproduct_id
です。次の例では、3003というproduct_id
を含むオブジェクト・ビューoc_inventories
にある行へのREF
を作成します。
SELECT MAKE_REF (oc_inventories, 3003) FROM DUAL; MAKE_REF(OC_INVENTORIES,3003) ------------------------------------------------------------------ 00004A038A0046857C14617141109EE03408002082543600000014260100010001 00290090606002A00078401FE0000000B03C21F040000000000000000000000000 0000000000
MAX
はexpr
の最大値を戻します。これは、集計ファンクションまたは分析ファンクションとして使用できます。
次の例では、hr.employees
表の最高給与を検索します。
SELECT MAX(salary) "Maximum" FROM employees; Maximum ---------- 24000
次の例では、各従業員について、その従業員と所属が同じ従業員のうち、一番高い給与を計算します。
SELECT manager_id, last_name, salary, MAX(salary) OVER (PARTITION BY manager_id) AS mgr_max FROM employees ORDER BY manager_id, last_name, salary, mgr_max; MANAGER_ID LAST_NAME SALARY MGR_MAX ---------- ------------------------- ---------- ---------- 100 Cambrault 11000 17000 100 De Haan 17000 17000 100 Errazuriz 12000 17000 100 Fripp 8200 17000 100 Hartstein 13000 17000 100 Kaufling 7900 17000 100 Kochhar 17000 17000 . . .
この問合せを述語のある親問合せで囲むと、各部門で給与の一番高い従業員がわかります。
SELECT manager_id, last_name, salary FROM (SELECT manager_id, last_name, salary, MAX(salary) OVER (PARTITION BY manager_id) AS rmax_sal FROM employees) WHERE salary = rmax_sal ORDER BY manager_id, last_name, salary; MANAGER_ID LAST_NAME SALARY ---------- ------------------------- ---------- 100 De Haan 17000 100 Kochhar 17000 101 Greenberg 12000 101 Higgins 12000 102 Hunold 9000 103 Ernst 6000 108 Faviet 9000 114 Khoo 3100 120 Nayer 3200 120 Taylor 3200 121 Sarchand 4200 122 Chung 3800 123 Bell 4000 124 Rajs 3500 145 Tucker 10000 146 King 10000 147 Vishney 10500 148 Ozer 11500 149 Abel 11000 201 Fay 6000 205 Gietz 8300 King 24000 22 rows selected.
MEDIAN
は、連続分散モデルを想定する逆分散関数です。このファンクションは、数値または日時値を取り、その中央値、または値のソート後に中央値となる補間された値を戻します。計算では、NULLは無視されます。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。expr
のみを指定した場合、このファンクションは引数の数値データ型と同じデータ型を戻します。OVER
句を指定した場合、Oracle Databaseは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。
MEDIAN
の結果の計算では、まず行が順序付けされます。グループ内の行数としてN
が使用され、対象の行番号(RN
)がRN
= (1
+ (0.5
×(N
-1
))という式で計算されます。集計ファンクションの最終結果は、行番号がCRN
= CEILING
(RN
)およびFRN
= FLOOR
(RN
)の行の値間の直線補間によって計算されます。
最終結果は次のとおりです。
if (CRN = FRN = RN) then (value of expression from row at RN) else (CRN - RN) * (value of expression for row at FRN) + (RN - FRN) * (value of expression for row at CRN)
MEDIAN
は、分析ファンクションとして使用できます。その場合、OVER
句には、query_partition_clause
のみを指定できます。各行に対して、各パーティション内の一連の値の中央値に該当する値が戻されます。
このファンクションと次のファンクションを比較してください。
MEDIAN
は、パーセンタイル値がデフォルトで0.5に指定される特別なPERCENTILE_CONT
です。
次の問合せは、hr.employees
表内の各従業員の給与の中央値を戻します。
SELECT department_id, MEDIAN(salary) FROM employees GROUP BY department_id ORDER BY department_id, median(salary); DEPARTMENT_ID MEDIAN(SALARY) ------------- -------------- 10 4400 20 9500 30 2850 40 6500 50 3100 60 4800 70 10000 80 8900 90 17000 100 8000 110 10150 7000
次の問合せは、hr.employees
表内の部門のサブセットのマネージャごとに給与の中央値を戻します。
SELECT manager_id, employee_id, salary, MEDIAN(salary) OVER (PARTITION BY manager_id) "Median by Mgr" FROM employees WHERE department_id > 60 ORDER BY manager_id, employee_id, salary, "Median by Mgr"; MANAGER_ID EMPLOYEE_ID SALARY Median by Mgr ---------- ----------- ---------- ------------- 100 101 17000 13500 100 102 17000 13500 100 145 14000 13500 100 146 13500 13500 100 147 12000 13500 100 148 11000 13500 100 149 10500 13500 101 108 12000 12000 101 204 10000 12000 101 205 12000 12000 108 109 9000 7800 108 110 8200 7800 108 111 7700 7800 108 112 7800 7800 108 113 6900 7800 145 150 10000 8500 145 151 9500 8500 145 152 9000 8500 . . .
MIN
は、expr
の最小値を戻します。これは、集計ファンクションまたは分析ファンクションとして使用できます。
次の例では、hr.employees
表の最初の雇用開始日を戻します。
SELECT MIN(hire_date) "Earliest" FROM employees; Earliest --------- 17-JUN-87
次の例では、各従業員について、その従業員が雇用された日以前に雇用された従業員を検索します。その従業員と所属が同じ従業員のサブセットを決定し、そのサブセット内で一番低い給与を戻します。
SELECT manager_id, last_name, hire_date, salary, MIN(salary) OVER(PARTITION BY manager_id ORDER BY hire_date RANGE UNBOUNDED PRECEDING) AS p_cmin FROM employees ORDER BY manager_id, last_name, hire_date, salary, p_cmin; MANAGER_ID LAST_NAME HIRE_DATE SALARY P_CMIN ---------- ------------------------- --------- ---------- ---------- 100 Cambrault 15-OCT-99 11000 6500 100 De Haan 13-JAN-93 17000 17000 100 Errazuriz 10-MAR-97 12000 7900 100 Fripp 10-APR-97 8200 7900 100 Hartstein 17-FEB-96 13000 7900 100 Kaufling 01-MAY-95 7900 7900 100 Kochhar 21-SEP-89 17000 17000 100 Mourgos 16-NOV-99 5800 5800 100 Partners 05-JAN-97 13500 7900 100 Raphaely 07-DEC-94 11000 11000 100 Russell 01-OCT-96 14000 7900 . . .
MOD
はn2
をn1
で割った余りを戻します。n1
が0の場合は、n2
を戻します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。Oracleは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。
次の例では、11を4で割ったときの余りを戻します。
SELECT MOD(11,4) "Modulus" FROM DUAL; Modulus ---------- 3
このファンクションは、m
が負の場合には古典数学のモジュール・ファンクションとは異なる動作をします。古典数学のモジュール・ファンクションは、次の公式を用いたMOD
ファンクションで表すことができます。
m - n * FLOOR(m/n)
次の表に、MOD
ファンクションと古典数学のモジュール・ファンクションの相違を示します。
m | n | MOD(m,n) | 古典数学のモジュール・ファンクション |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MONTHS_BETWEEN
は、日付date1
とdate2
の間の月数を戻します。月および月の最終日は、パラメータNLS_CALENDAR
によって定義されます。date1
がdate2
より後の日付の場合、結果は正の値になります。date1
がdate2
より前の日付の場合、結果は負の値になります。date1
およびdate2
が、月の同じ日または月の最終日の場合、結果は常に整数になります。それ以外の場合、Oracle Databaseは結果の小数部を1か月31日として計算し、date1
とdate2
の差を割り出します。
次の例では、2つの日付間の月数を計算します。
SELECT MONTHS_BETWEEN (TO_DATE('02-02-1995','MM-DD-YYYY'), TO_DATE('01-01-1995','MM-DD-YYYY') ) "Months" FROM DUAL; Months ---------- 1.03225806
NANVL
ファンクションは、BINARY_FLOAT
型またはBINARY_DOUBLE
型の浮動小数点数のみに有効です。このファンクションは、入力値n2
がNaN
(非数値)の場合は代替値n1
を戻すようにOracle Databaseに指示します。n2
がNaN
でない場合、Oracleはn2
を戻します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。Oracleは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。
参照:
暗黙的な変換の詳細は、表2-10「暗黙的な型変換のマトリックス」を参照してください。2進浮動小数点の比較セマンティクスの詳細は、「浮動小数点数」を参照してください。数値の優先順位詳細は、「数値の優先順位」を参照してください。 |
「TO_BINARY_DOUBLE」で作成したfloat_point_demo
を使用して、表に2つ目のエントリを挿入します。
Insert INTO float_point_demo VALUES (0,'NaN','NaN'); SELECT * FROM float_point_demo; DEC_NUM BIN_DOUBLE BIN_FLOAT ---------- ---------- ---------- 1234.56 1.235E+003 1.235E+003 0 Nan Nan
次の例では、数値の場合はbin_float
を戻します。数値以外の場合は、0(ゼロ)を戻します。
SELECT bin_float, NANVL(bin_float,0) FROM float_point_demo; BIN_FLOAT NANVL(BIN_FLOAT,0) ---------- ------------------ 1.235E+003 1.235E+003 Nan 0
NCHR
は、各国語キャラクタ・セットのnumber
と同等のバイナリを持つ文字を戻します。戻り値は常にNVARCHAR2
です。このファンクションは、CHR
ファンクションにUSING
NCHAR_CS
句を指定して使用した場合と同じ結果を戻します。
このファンクションは、引数として、NUMBER
値、または暗黙的にNUMBER
型に変換可能な任意の値を取り、文字を戻します。
次の例では、NCHAR文字187を戻します。
SELECT NCHR(187) FROM DUAL; NC -- > SELECT CHR(187 USING NCHAR_CS) FROM DUAL; CH -- >
NEW_TIME
は、タイムゾーンtimezone1
の日時がdate
の時点のタイムゾーンtimezone2
の日時を戻します。このファンクションを使用する前に、24時間で表示されるように、NLS_DATE_FORMAT
パラメータを設定する必要があります。戻り型は、date
のデータ型に関係なく常にDATE
です。
引数timezone1
およびtimezone2
には、次のテキスト文字列のいずれかを指定できます。
次の例では、指定された太平洋標準時と同等の大西洋標準時を戻します。
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; SELECT NEW_TIME(TO_DATE( '11-10-99 01:23:45', 'MM-DD-YY HH24:MI:SS'), 'AST', 'PST') "New Date and Time" FROM DUAL; New Date and Time -------------------- 09-NOV-1999 21:23:45
NEXT_DAY
は、char
で指定した曜日で、日付date
より後の最初の日付を戻します。戻り型は、date
のデータ型に関係なく常にDATE
です。引数char
は、セッションの日付言語での曜日である必要があります(フルネームでも省略形でも可)。必要最小限の文字数は、省略形の文字数です。有効な省略形の後に続けて文字が入力されていても、それらの文字は無視されます。戻り値は、引数date
と同じ時、分および秒のコンポーネントを持っています。
次の例では、2001年2月2日以降の最初の火曜日の日付を戻します。
SELECT NEXT_DAY('02-FEB-2001','TUESDAY') "NEXT DAY" FROM DUAL; NEXT DAY ----------- 06-FEB-2001
NLS_CHARSET_DECL_LEN
は、NCHAR
列の宣言の長さを(文字数で)戻します。byte_count
引数は、列の幅です。char_set_id
引数は、列のキャラクタ・セットIDです。
次の例では、マルチバイト・キャラクタ・セットを使用している場合に、列の幅が200バイトである文字の数を戻します。
SELECT NLS_CHARSET_DECL_LEN (200, nls_charset_id('ja16eucfixed')) FROM DUAL; NLS_CHARSET_DECL_LEN(200,NLS_CHARSET_ID('JA16EUCFIXED')) -------------------------------------------------------- 100
NLS_CHARSET_ID
は、キャラクタ・セット名string
に対応するキャラクタ・セットのID番号を戻します。引数string
は、実行時のVARCHAR2
値です。string
値'CHAR_CS
'は、サーバーのデータベース・キャラクタ・セットのID番号を戻します。string
値'NCHAR_CS
'は、サーバーの各国語キャラクタ・セットのID番号を戻します。
無効なキャラクタ・セット名を指定すると、NULLが戻されます。
次の例では、キャラクタ・セットのIDを戻します。
SELECT NLS_CHARSET_ID('ja16euc') FROM DUAL; NLS_CHARSET_ID('JA16EUC') ------------------------- 830
NLS_CHARSET_NAME
は、ID番号number
に対応するキャラクタ・セット名を戻します。キャラクタ・セット名は、データベース・キャラクタ・セットのVARCHAR2
値として戻されます。
number
が有効なキャラクタ・セットIDとして認識されない場合は、このファンクションはNULLを戻します。
次の例では、キャラクタ・セットのID番号2に対応するキャラクタ・セットを戻します。
SELECT NLS_CHARSET_NAME(2) FROM DUAL; NLS_CH ------ WE8DEC
NLS_INITCAP
は、各単語の最初の文字を大文字、残りの文字を小文字にしてchar
を戻します。単語は空白または英数字以外の文字で区切ります。
char
および'nlsparam'
は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
データ型です。戻される文字列は、VARCHAR2
データ型であり、char
と同じキャラクタ・セットです。
'nlsparam'
の値は次の書式で指定します。
'NLS_SORT = sort'
sort
は、言語ソート基準またはBINARY
のいずれかです。言語ソート基準は、大文字と小文字の変換のために特別な言語要件を処理します。これらの要件によって、char
と異なる長さの値が戻される場合があります。'nlsparam'
を省略すると、このファンクションはセッションに対してデフォルトのソート基準を使用します。
このファンクションは、CLOB
データを直接的にサポートしていません。ただし、暗黙的なデータ変換を使用してCLOB
を引数として渡すことはできます。
次に、ファンクションによって言語ソート基準がどのように異なる値を戻すかを示します。
SELECT NLS_INITCAP ('ijsland') "InitCap" FROM DUAL; InitCap ------- Ijsland SELECT NLS_INITCAP ('ijsland', 'NLS_SORT = XDutch') "InitCap" FROM DUAL; InitCap ------- IJsland
NLS_LOWER
は、すべての文字を小文字にしてchar
を戻します。
char
および'nlsparam'
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。戻される文字列は、char
が文字データ型の場合はVARCHAR2
データ型になり、char
がLOBデータ型の場合はLOBになります。char
と同じキャラクタ・セットの文字列が戻されます。
'nlsparam'
の書式および用途は、NLS_INITCAP
ファンクションと同じです。
次の例では、XGerman言語ソート順序を使用する文字列'citta'
'を戻します。
SELECT NLS_LOWER ('CITTA''', 'NLS_SORT = XGerman') "Lowercase" FROM DUAL; Lowerc ------ citta'
NLSSORT
は、char
のソートに使用される文字列のバイトを戻します。
char
および'nlsparam'
は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
データ型です。戻される文字列はRAW
データ型です。
'nlsparam'
の値は次の書式で指定します。
'NLS_SORT = sort'
sort
は、言語ソート基準またはBINARY
のいずれかです。'nlsparam'
を省略すると、このファンクションはセッションに対してデフォルトのソート基準を使用します。BINARY
を指定すると、このファンクションはchar
を戻します。
'nlsparam'
を指定した場合、言語ソート名に接尾辞_ai
を追加してアクセント記号の有無を区別しないソートを行うか、または_ci
を追加して大/小文字を区別しないソートを行うことができます。アクセント記号の有無および大/小文字を区別しないソートの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
このファンクションは、CLOB
データを直接的にサポートしていません。ただし、暗黙的なデータ変換を使用してCLOB
を引数として渡すことはできます。
このファンクションを使用すると、文字列の2進値を基にしたソートおよび比較ではなく、言語ソート基準を基にしたソートおよび比較を指定できます。次の例では、2つの値を含むテスト表を作成し、戻される値がNLSSORT
ファンクションによってどのように順序付けられるかを示します。
CREATE TABLE test (name VARCHAR2(15)); INSERT INTO test VALUES ('Gaardiner'); INSERT INTO test VALUES ('Gaberd'); INSERT INTO test VALUES ('Gaasten'); SELECT * FROM test ORDER BY name; NAME --------------- Gaardiner Gaasten Gaberd SELECT * FROM test ORDER BY NLSSORT(name, 'NLS_SORT = XDanish'); NAME --------------- Gaberd Gaardiner Gaasten
次の例では、比較操作でのNLSSORT
ファンクションの使用方法を示します。
SELECT * FROM test WHERE name > 'Gaberd' ORDER BY name; no rows selected SELECT * FROM test WHERE NLSSORT(name, 'NLS_SORT = XDanish') > NLSSORT('Gaberd', 'NLS_SORT = XDanish') ORDER BY name; NAME --------------- Gaardiner Gaasten
同一の言語ソート基準を使用する比較操作で頻繁にNLSSORT
を使用する場合、NLS_COMP
パラメータ(データベース用か現行のセッション用のいずれか)にLINGUISTIC
を設定し、セッションのNLS_SORT
パラメータに必要なソート基準を設定するとより効率的です。これによって、現行のセッション中のすべてのソート操作および比較操作において、デフォルトでそのソート基準が使用されるようになります。
ALTER SESSION SET NLS_COMP = 'LINGUISTIC'; ALTER SESSION SET NLS_SORT = 'XDanish'; SELECT * FROM test WHERE name > 'Gaberd' ORDER BY name; NAME --------------- Gaardiner Gaasten
NLS_UPPER
は、すべての文字を大文字にしてchar
を戻します。
char
および'nlsparam'
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。戻される文字列は、char
が文字データ型の場合はVARCHAR2
データ型になり、char
がLOBデータ型の場合はLOBになります。char
と同じキャラクタ・セットの文字列が戻されます。
'nlsparam'
の書式および用途は、NLS_INITCAP
ファンクションと同じです。
次の例では、すべての文字を大文字に変換して文字列を戻します。
SELECT NLS_UPPER ('große') "Uppercase" FROM DUAL; Upper ----- GROßE SELECT NLS_UPPER ('große', 'NLS_SORT = XGerman') "Uppercase" FROM DUAL; Upperc ------ GROSSE
NTILE
は分析ファンクションです。これは、順序付けられたデータセットをexpr
に指定した数のバケットに分割し、適切なバケット番号を各行に割り当てます。バケットには1〜expr
の番号が付けられます。expr
値は、パーティションごとに、正の定数に変換される必要があります。Oracle Databaseではexpr
は整数とみなされるため、この値が整数ではない定数の場合は整数に切り捨てられます。戻り値は、NUMBER
です。
バケット内の行数は、最大で1異なります。残りの値(バケットで割った行数の余り)は、バケット1から順に、1行ずつ分割されます。
expr
が行数より大きい場合、行数と等しい数のバケットに行が入れられ、余りのバケットは空になります。
expr
には、NTILE
または他の分析ファンクションを使用して分析ファンクションをネストできません。ただし、他の組込みファンクション式をexpr
で使用できます。
次の例では、部門100のoe.employees
表のsalary
列の値を4つのバケットに分割します。この部門のsalary
列には6つの値が存在するため、2つの余分な値(6を4で割った余り)は、バケット1および2に割り当てられます。そのため、バケット1および2は、バケット3または4より値が1つ多くなります。
SELECT last_name, salary, NTILE(4) OVER (ORDER BY salary DESC) AS quartile FROM employees WHERE department_id = 100 ORDER BY last_name, salary, quartile; LAST_NAME SALARY QUARTILE ------------------------- ---------- ---------- Chen 8200 2 Faviet 9000 1 Greenberg 12000 1 Popp 6900 4 Sciarra 7700 3 Urman 7800 2
NULLIF
は、expr1
とexpr2
を比較します。同じである場合は、NULLを戻します。異なる場合は、expr1
を戻します。expr1
には、リテラルNULL
を指定できません。
両方の引数が数値データ型である場合、Oracle Databaseは、数値の優先順位が高い方の引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。2つの引数が数値ではない場合、それらのデータ型が同じである必要があります。データ型が異なる場合、Oracleはエラーを戻します。
NULLIF
ファンクションは、次のCASE
式と論理的に同じです。
CASE WHEN expr1 = expr 2 THEN NULL ELSE expr1 END
次の例では、サンプル・スキーマhr
から、雇用後に職種が変更した従業員を検索します。これは、employees
表の現行のjob_id
がjob_history
表のjob_id
と異なるかどうかによって識別されます。
SELECT e.last_name, NULLIF(e.job_id, j.job_id) "Old Job ID" FROM employees e, job_history j WHERE e.employee_id = j.employee_id ORDER BY last_name, "Old Job ID"; LAST_NAME Old Job ID ------------------------- ---------- De Haan AD_VP Hartstein MK_MAN Kaufling ST_MAN Kochhar AD_VP Kochhar AD_VP Raphaely PU_MAN Taylor SA_REP Taylor Whalen AD_ASST Whalen
NUMTODSINTERVAL
は、n
をINTERVAL
DAY
TO
SECOND
リテラルに変換します。引数n
には、任意のNUMBER
値か、またはNUMBER
値に暗黙的に変換可能な式を指定できます。引数interval_unit
のデータ型は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
です。interval_unit
の値にはn
の単位を指定します。この値は次の文字列値のいずれかである必要があります。
interval_unit
では、大/小文字は区別されません。カッコ内の先行値および後続値は無視されます。デフォルトでは、戻り値の精度は9です。
次の例では、COUNT
分析ファンクションにNUMTODSINTERVAL
を使用し、各従業員について、雇用開始日から過去100日以内に同じマネージャの部下として配属された従業員の人数を計算します。分析ファンクションの構文の詳細は、「分析ファンクション」を参照してください。
SELECT manager_id, last_name, hire_date, COUNT(*) OVER (PARTITION BY manager_id ORDER BY hire_date RANGE NUMTODSINTERVAL(100, 'day') PRECEDING) AS t_count FROM employees; MANAGER_ID LAST_NAME HIRE_DATE T_COUNT ---------- ------------------------- --------- ---------- 100 Kochhar 21-SEP-89 1 100 De Haan 13-JAN-93 1 100 Raphaely 07-DEC-94 1 100 Kaufling 01-MAY-95 1 100 Hartstein 17-FEB-96 1 . . . 149 Grant 24-MAY-99 1 149 Johnson 04-JAN-00 1 201 Goyal 17-AUG-97 1 205 Gietz 07-JUN-94 1 King 17-JUN-87 1
NUMTOYMINTERVAL
は、数値n
をINTERVAL
YEAR
TO
MONTH
リテラルに変換します。引数n
には、任意のNUMBER
値か、またはNUMBER
値に暗黙的に変換可能な式を指定できます。引数interval_unit
のデータ型は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
です。interval_unit
の値にはn
の単位を指定します。この値は次の文字列値のいずれかである必要があります。
interval_unit
では、大/小文字は区別されません。カッコ内の先行値および後続値は無視されます。デフォルトでは、戻り値の精度は9です。
次の例では、SUM
分析ファンクションにNUMTOYMINTERVAL
を使用し、各従業員について、その従業員の雇用日から過去1年の間に雇用された従業員の給与の合計を計算します。分析ファンクションの構文の詳細は、「分析ファンクション」を参照してください。
SELECT last_name, hire_date, salary, SUM(salary) OVER (ORDER BY hire_date RANGE NUMTOYMINTERVAL(1,'year') PRECEDING) AS t_sal FROM employees ORDER BY last_name, hire_date; LAST_NAME HIRE_DATE SALARY T_SAL ------------------------- --------- ---------- ---------- King 17-JUN-87 24000 24000 Whalen 17-SEP-87 4400 28400 Kochhar 21-SEP-89 17000 17000 . . . Markle 08-MAR-00 2200 112400 Ande 24-MAR-00 6400 106500 Banda 21-APR-00 6200 109400 Kumar 21-APR-00 6100 109400
NVL
を使用すると、NULL(空白として戻される)を文字列に置換して問合せの結果に含めることができます。expr1
がNULLの場合、NVL
はexpr2
を戻します。expr1
がNULLでない場合、NVL
はexpr1
を戻します。
引数expr1
およびexpr2
は、任意のデータ型を持つことができます。2つの引数のデータ型が異なる場合、一方のデータ型が他方のデータ型に暗黙的に変換されます。暗黙的に変換できない場合、データベースはエラーを戻します。暗黙的な変換は、次のように実行されます。
expr1
が文字データの場合、Oracle Databaseは2つの引数を比較する前にexpr2
をexpr1
のデータ型に変換し、expr1
のキャラクタ・セットでVARCHAR2
を戻します。
expr1
が数値である場合、Oracleは数値の優先順位が最も高い引数を判断し、その引数のデータ型に他方の引数を暗黙的に変換して、そのデータ型を戻します。次の例では、従業員が歩合を受け取らない場合、従業員名および従業員の歩合「Not Applicable」を表示します。
SELECT last_name, NVL(TO_CHAR(commission_pct), 'Not Applicable') "COMMISSION" FROM employees WHERE last_name LIKE 'B%' ORDER BY last_name; LAST_NAME COMMISSION ------------------------- ---------------------------------------- Baer Not Applicable Baida Not Applicable Banda .1 Bates .15 Bell Not Applicable Bernstein .25 Bissot Not Applicable Bloom .2 Bull Not Applicable
NVL2
を使用すると、指定された式がNULLかどうかに基づく問合せによって戻される値を判断できます。expr1
がNULLでない場合、NVL2
はexpr2
を戻します。expr1
がNULLの場合、NVL2
はexpr3
を戻します。
引数expr1
は、任意のデータ型を持つことができます。引数expr2
およびexpr3
は、LONG
以外の任意のデータ型を持つことができます。
expr2
とexpr3
のデータ型が異なる場合、次のようになります。
expr2
が文字データの場合、Oracle Databaseは、expr3
がNULLの定数ではないかぎり、2つの引数を比較する前にexpr3
をexpr2
のデータ型に変換します。expr3
がNULL定数の場合は、データ型の変換は行われません。Oracleは、expr2
のキャラクタ・セットでVARCHAR2
を戻します。
expr2
が数値である場合、Oracleは、数値の優先順位が最も高い引数を判断し、その引数のデータ型に他方の引数を暗黙的に変換して、そのデータ型を戻します。次の例では、employees
のcommission_pct
列がNULLかどうかによって、従業員の収入が給与と歩合か、または給与のみかを示します。
SELECT last_name, salary, NVL2(commission_pct, salary + (salary * commission_pct), salary) income FROM employees WHERE last_name like 'B%' ORDER BY last_name; LAST_NAME SALARY INCOME ------------------------- ---------- ---------- Baer 10000 10000 Baida 2900 2900 Banda 6200 6882 Bates 7300 8468 Bell 4000 4000 Bernstein 9500 11970 Bissot 3300 3300 Bloom 10000 12100 Bull 4100 4100
ORA_HASH
ファンクションは、指定された式のハッシュ値を計算します。このファンクションは、データのサブセットの分析や、ランダムな標本の生成などの操作に有効です。
expr
引数には、Oracle Databaseでハッシュ値を計算するデータを指定します。expr
に指定できるデータの長さの制限はありません。このデータは通常、列名です。expr
は、LONG
型またはLOB型にはできません。また、ネストした表型でない場合は、ユーザー定義オブジェクト型にできません。ネストした表型のハッシュ値は、コレクション内の要素の順序に依存しません。その他のデータ型はすべて、expr
でサポートされています。
max_bucket
引数には、ハッシュ・ファンクションから戻される最大バケット値を指定します。0(ゼロ)〜4294967295の任意の値を指定できます。デフォルトは4294967295です。
seed_value
引数を指定すると、同じデータ・セットに対して様々な結果を生成できます。Oracleは、ハッシュ・ファンクションをexpr
とseed_value
の組合せに適用します。0(ゼロ)〜4294967295の任意の値を指定できます。デフォルトは0(ゼロ)です。
戻り値はNUMBER
です。
次の例では、sh.sales
表内の顧客IDと製品IDの各組合せに対してハッシュ値を作成し、そのハッシュ値を最大100個のバケットに分割して、最初のバケット(バケット0(ゼロ))でamount_sold
値の合計を戻します。3つ目の引数(5)には、ハッシュ・ファンクションのシード値を指定しています。このシード値を変更すると、同じ問合せで異なるハッシュ結果を得ることができます。
SELECT SUM(amount_sold) FROM sales WHERE ORA_HASH(CONCAT(cust_id, prod_id), 99, 5) = 0; SUM(AMOUNT_SOLD) ---------------- 989431.14
PATH
は、UNDER_PATH
およびEQUALS_PATH
条件でのみ使用される補助ファンクションです。一次条件で指定されたリソースへの相対パスを戻します。
correlation_integer
はNUMBER
型の任意の整数で、この補助ファンクションをその一次条件と関連付けるために使用します。1未満の値は1として扱われます。
EQUALS_PATH
条件およびUNDER_PATH
条件でこの補助ファンクションを使用する例は、関連ファンクション「DEPTH」を参照してください。
PERCENT_RANK
は、CUME_DIST
(累積分布)ファンクションと似ています。PERCENT_RANK
が戻す値の範囲は、0〜1(0および1を含む)です。すべての集合の最初の行のPERCENT_RANK
は0(ゼロ)になります。戻り値はNUMBER
です。
PERCENT_RANK
は、ファンクションの引数および対応するソート指定によって識別される不確定な行r
を計算し、行r
のランクから1を引いて、集計グループ内の行の数で割ります。不確定な行r
をOracle Databaseが集計する行のグループに挿入するように計算します。このファンクションの引数は、各集計グループ内の1つの不確定行を識別します。このため、すべての引数は、集計グループ内で定数式と評価される必要があります。定数引数式および集計のORDER
BY
句の式の位置は、一致します。このため、引数の数は同じであり、その型は互換性がある必要があります。
PERCENT_RANK
は、行r
に対して、r
のランクから1引いた数を評価される行数(問合せ結果セット全体またはパーティション)より1少ない数で割ります。
次の例では、サンプル表hr.employees
から、給与が15,500ドルであり、歩合が5%である不確定な従業員のパーセント・ランクを計算します。
SELECT PERCENT_RANK(15000, .05) WITHIN GROUP (ORDER BY salary, commission_pct) "Percent-Rank" FROM employees; Percent-Rank ------------ .971962617
次の例では、従業員ごとに、部門内での給与のパーセント・ランクを計算します。
SELECT department_id, last_name, salary, PERCENT_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS pr FROM employees ORDER BY pr, salary; DEPARTMENT_ID LAST_NAME SALARY PR ------------- ------------------------- ---------- ---------- 10 Whalen 4400 0 40 Marvis 6500 0 . . . 80 Vishney 10500 .176470588 50 Everett 3900 .181818182 30 Khoo 3100 .2 . . . 80 Johnson 6200 .941176471 50 Markle 2200 .954545455 50 Philtanker 2200 .954545455 50 Olson 2100 1 . . .
PERCENTILE_CONT
は、連続分散モデルを想定する逆分散関数です。このファンクションは、パーセンタイル値およびソート指定を用い、そのソート指定に従ってそのパーセンタイル値に該当する補間された値を戻します。計算では、NULLは無視されます。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。また、引数の数値データ型と同じデータ型を戻します。
最初のexpr
は、パーセンタイル値であるため、0〜1の数値で評価します。このexpr
は、各集計グループ内の定数である必要があります。ORDER
BY
句には、Oracleが補間を実行できる型である数値または日時値の単一式を指定します。
PERCENTILE_CONT
の結果は、順序付けされた後の値間の直線補間によって計算されます。集計グループで、パーセンタイル値(P)および行数(N)を使用すると、ソート指定に従って行を順序付けた後の行数を計算できます。この行数(RN)は、計算式RN = (1+ (P*(N-1))
に従って計算されます。集計ファンクションの最終結果は、行番号がCRN = CEILING(RN)
およびFRN = FLOOR(RN)
の行の値間の直線補間によって計算されます。
最終結果は次のとおりです。
If (CRN = FRN = RN) then the result is (value of expression from row at RN) Otherwise the result is (CRN - RN) * (value of expression for row at FRN) + (RN - FRN) * (value of expression for row at CRN)
PERCENTILE_CONT
ファンクションは、分析ファンクションとしても使用できます。その場合、OVER
句には、query_partitioning_clause
のみを指定できます。各行に対して、各パーティション内の一連の値から、指定されたパーセンタイルに該当する値を戻します。
MEDIAN
ファンクションは、パーセンタイル値がデフォルトで0.5に指定される特別なPERCENTILE_CONT
です。詳細は、「MEDIAN」を参照してください。
次の例では、各部門の給与の中央値を計算します。
SELECT department_id, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary DESC) "Median cont", PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY salary DESC) "Median disc" FROM employees GROUP BY department_id ORDER BY department_id, "Median cont", "Median disc; DEPARTMENT_ID Median cont Median disc ------------- ----------- ----------- 10 4400 4400 20 9500 13000 30 2850 2900 40 6500 6500 50 3100 3100 60 4800 4800 70 10000 10000 80 8900 9000 90 17000 17000 100 8000 8200 110 10150 12000 7000 7000
PERCENTILE_CONT
およびPERCENTILE_DISC
は、異なる結果を戻す場合があります。PERCENTILE_CONT
は、直線補間後の結果を計算します。PERCENTILE_DISC
は、集計された一連の値から値のみを戻します。この例に示すように、パーセンタイル値が0.5の場合、PERCENTILE_CONT
は、偶数の要素を持つグループの中間の2つの値の平均を戻します。それに対して、PERCENTILE_DISC
は、中間の2つの値の最初の値を戻します。奇数の要素を持つ集計グループでは、どちらのファンクションも中間の要素の値を戻します。
次の例では、0.5のパーセンタイル(Percent_Rank
)に対応する部門60の中央値は4800です。部門30の給与にパーセンタイル0.5がないため、2900(パーセンタイル0.4)〜2800(パーセンタイル0.6)の範囲で2850に評価される中央値が補間される必要があります。
SELECT last_name, salary, department_id, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary DESC) OVER (PARTITION BY department_id) "Percentile_Cont", PERCENT_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) "Percent_Rank" FROM employees WHERE department_id IN (30, 60) ORDER BY last_name, salary, department_id, "Percentile_Cont", "Percent_Rank"; LAST_NAME SALARY DEPARTMENT_ID Percentile_Cont Percent_Rank ------------------------- ---------- ------------- --------------- ------------ Austin 4800 60 4800 .5 Baida 2900 30 2850 .4 Colmenares 2500 30 2850 1 Ernst 6000 60 4800 .25 Himuro 2600 30 2850 .8 Hunold 9000 60 4800 0 Khoo 3100 30 2850 .2 Lorentz 4200 60 4800 1 Pataballa 4800 60 4800 .5 Raphaely 11000 30 2850 0 Tobias 2800 30 2850 .6
PERCENTILE_DISC
は、不連続分散モデルを想定する逆分散関数です。このファンクションでは、パーセンタイル値およびソート指定を指定し、そのセットから要素を戻します。計算では、NULLは無視されます。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。また、引数の数値データ型と同じデータ型を戻します。
最初のexpr
は、パーセンタイル値であるため、0〜1の数値で評価します。このexprは、各集計グループ内の定数である必要があります。ORDER
BY
句には、ソート可能な型の単一式を指定します。
指定されたパーセンタイル値P
に対して、PERCENTILE_DISC
は、ORDER
BY
句の式の値をソートし、P
以上である(同じソート指定に従う)最小CUME_DIST
値を持つ値を戻します。
「PERCENTILE_CONT」の例を参照してください。
次の例では、サンプル表hr.employees
の各従業員の給与の中央値不連続パーセンタイルを計算します。
SELECT last_name, salary, department_id, PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY salary DESC) OVER (PARTITION BY department_id) "Percentile_Disc", CUME_DIST() OVER (PARTITION BY department_id ORDER BY salary DESC) "Cume_Dist" FROM employees where department_id in (30, 60) ORDER BY last_name, salary, department_id, "Percentile_Disc", "Cume_Dist"; LAST_NAME SALARY DEPARTMENT_ID Percentile_Disc Cume_Dist ------------------------- ---------- ------------- --------------- ---------- Austin 4800 60 4800 .8 Baida 2900 30 2900 .5 Colmenares 2500 30 2900 1 Ernst 6000 60 4800 .4 Himuro 2600 30 2900 .833333333 Hunold 9000 60 4800 .2 Khoo 3100 30 2900 .333333333 Lorentz 4200 60 4800 1 Pataballa 4800 60 4800 .8 Raphaely 11000 30 2900 .166666667 Tobias 2800 30 2900 .666666667
部門30の中央値の値は2900です。この値の対応するパーセンタイル(Cume_Dist
)は、0.5以上の最小値です。部門60の中央値の値は4800です。この値の対応するパーセンタイルは、0.5以上の最小値です。
POWER
は、n2
をn1
乗した値を戻します。底n2
および指数n1
は任意の数です。ただし、n2
が負の場合、n1
は整数である必要があります。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。いずれかの引数がBINARY_FLOAT
またはBINARY_DOUBLE
の場合、このファンクションはBINARY_DOUBLE
を戻します。それ以外の場合、NUMBER
を戻します。
次の例では、3の2乗を戻します。
SELECT POWER(3,2) "Raised" FROM DUAL; Raised ---------- 9
POWERMULTISET
は、入力としてネストした表を取り、入力されたネストした表のすべての空でないサブセットを含む、ネストした表のネストした表(サブ多重集合という)を戻します。
expr
には、ネストした表に評価される任意の式を指定できます。
expr
がNULLである場合、Oracle DatabaseはNULL
を戻します。
expr
がネストした表である場合、Oracleはエラーを戻します。
まず、cust_address_tab_type
データ型のネストした表であるデータ型を作成します。
CREATE TYPE cust_address_tab_tab_typ AS TABLE OF cust_address_tab_typ;
次に、POWERMULTISET
ファンクションを使用して、customers_demo
表から、ネストした表の列cust_address_ntab
を選択します。
SELECT CAST(POWERMULTISET(cust_address_ntab) AS cust_address_tab_tab_typ) FROM customers_demo; CAST(POWERMULTISET(CUST_ADDRESS_NTAB) AS CUST_ADDRESS_TAB_TAB_TYP) (STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID) ------------------------------------------------------------------ CUST_ADDRESS_TAB_TAB_TYP(CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP ('514 W Superior St', '46901', 'Kokomo', 'IN', 'US'))) CUST_ADDRESS_TAB_TAB_TYP(CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP ('2515 Bloyd Ave', '46218', 'Indianapolis', 'IN', 'US'))) CUST_ADDRESS_TAB_TAB_TYP(CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP ('8768 N State Rd 37', '47404', 'Bloomington', 'IN', 'US'))) CUST_ADDRESS_TAB_TAB_TYP(CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP ('6445 Bay Harbor Ln', '46254', 'Indianapolis', 'IN', 'US'))) . . .
前述の例では、customers_demo
表、およびデータを含むネストした表の列が必要です。この表およびネストした表の列を作成する方法については、「MULTISET演算子」を参照してください。
POWERMULTISET_BY_CARDINALITY
は、入力としてネストした表およびカーディナリティを取り、指定されたカーディナリティを持つネストした表のすべての空でないサブセットを含む、ネストした表のネストした表(サブ多重集合という)を戻します。
expr
には、ネストした表に評価される任意の式を指定できます。
cardinality
には、任意の整数を指定できます。
expr
がNULLである場合、Oracle DatabaseはNULL
を戻します。
expr
がネストした表である場合、Oracleはエラーを戻します。
まず、ネストした表のすべての行内の要素を複製し、ネストした表の行のカーディナリティを2に増やします。
UPDATE customers_demo SET cust_address_ntab = cust_address_ntab MULTISET UNION cust_address_ntab;
次に、POWERMULTISET_BY_CARDINALITY
ファンクションを使用して、customers_demo
表から、ネストした表の列cust_address_ntab
を選択します。
SELECT CAST(POWERMULTISET_BY_CARDINALITY(cust_address_ntab, 2) AS cust_address_tab_tab_typ) FROM customers_demo;
CAST(POWERMULTISET_BY_CARDINALITY(CUST_ADDRESS_NTAB,2) AS CUST_ADDRESS_TAB_TAB_TYP) (STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID) ---------------------------------------------------------------------------------------- CUST_ADDRESS_TAB_TAB_TYP(CUST_ADDRESS_TAB_TYP (CUST_ADDRESS_TYP('514 W Superior St', '46901', 'Kokomo', 'IN', 'US'), CUST_ADDRESS_TYP('514 W Superior St', '46901', 'Kokomo', 'IN', 'US'))) CUST_ADDRESS_TAB_TAB_TYP(CUST_ADDRESS_TAB_TYP (CUST_ADDRESS_TYP('2515 Bloyd Ave', '46218', 'Indianapolis', 'IN', 'US'), CUST_ADDRESS_TYP('2515 Bloyd Ave', '46218', 'Indianapolis', 'IN', 'US'))) CUST_ADDRESS_TAB_TAB_TYP(CUST_ADDRESS_TAB_TYP (CUST_ADDRESS_TYP('8768 N State Rd 37', '47404', 'Bloomington', 'IN', 'US'), CUST_ADDRESS_TYP('8768 N State Rd 37', '47404', 'Bloomington', 'IN', 'US'))) . . .
前述の例では、customers_demo
表、およびデータを含むネストした表の列が必要です。この表およびネストした表の列を作成する方法については、「MULTISET演算子」を参照してください。
このファンクションは、DBMS_DATA_MINING
パッケージまたはOracle Data Mining Java APIで作成したモデルで使用するためのものです。このファンクションは、モデルの最適な予測を戻します。戻されるデータ型は、モデルの作成中に使用するターゲット値の型によって異なります。回帰モデルの場合、このファンクションは期待値を戻します。
COST
句は、すべての分類モデルに対して有効です。
COST
MODEL
を指定します。このようなスコアリングのコスト・マトリックスが存在しない場合は、エラーが戻されます。
COST
MODEL
AUTO
を指定します。このとき、格納されたコスト・マトリックスが存在する場合は、このマトリックスを使用して最低のコスト予測が戻されます。格納されたコスト・マトリックスが存在しない場合は、最も高い確率の予測が戻されます。
VALUES
句(cost_matrix_clause
の下の方のブランチ)を使用します。表内コスト・マトリックスは、モデルがスコアリングのコスト・マトリックスに関連付けられているかどうかにかかわらず使用できます。
cost_matrix_clause
句を指定しない場合、最適な予測は最も高い確率を持つターゲット・クラスになります。2つ以上のクラスが最も高い確率にある場合、そのうちの1つのクラスが選択されます。
これは、モデルの作成時に提供された予測子をマップします。USING *
を指定すると、基礎となる入力(表、ビューなど)から取り出すことができる列と式にすべての予測子がマップされます。
mining_attribute_clause
で指定すると、余分な式が自動的に無視されます。
次の例では、提携カードを使用している可能性のある顧客の平均年齢を性別ごとに戻します。PREDICTION
ファンクションでは、cust_marital_status
、education
およびhousehold_size
の予測子のみを考慮します。
この例と前提条件のデータ・マイニング操作(ビューの作成など)は、デモ・ファイル$ORACLE_HOME/rdbms/demo/dmdtdemo.sql
で確認できます。データ・マイニングのデモ・ファイルの一般情報は、『Oracle Data Mining管理者ガイド』を参照してください。次に、このファンクションの構文の使用例を示します。
SELECT cust_gender, COUNT(*) AS cnt, ROUND(AVG(age)) AS avg_age FROM mining_data_apply_v WHERE PREDICTION(DT_SH_Clas_sample COST MODEL USING cust_marital_status, education, household_size) = 1 GROUP BY cust_gender ORDER BY cust_gender; C CNT AVG_AGE - ---------- ---------- F 170 38 M 685 42
PREDICTION_BOUNDS
ファンクションは、汎用化された線形モデルにのみ使用します。このファンクションは、LOWER
とUPPER
の2つのNUMBER
フィールドを持つオブジェクトを戻します。回帰マイニング・ファンクションの場合は、予測の値に限度が適用されます。分類マイニング・ファンクションの場合は、確率値に限度が適用されます。リッジ回帰を使用してGLMが構築されたか、または構築中に共分散マトリックスに異常があると認識された場合は、両方のフィールドにNULL
が戻されます。
confidence_level
には、(0,1)の範囲の数値を指定します。この句を省略した場合、デフォルト値は0.95になります。
class_value
引数は、分類モデルに対して有効ですが、回帰モデルには有効ではありません。デフォルトでは、最も高い確率の予測の限度が戻されます。class_value
引数を使用すると、ターゲット値に固有の限度値を除外できます。confidence_level
にNULL
を指定すると、デフォルトでconfidence_level
を残したままclass_value
を指定できます。
PREDICTION_BOUNDS
に対するmining_attribute_clause
の動作は、PREDICTION
の場合と同じです。詳細は、「mining_attribute_clause」を参照してください。
次の例では、98%の確度で年齢が25〜45才と予測される顧客の分布を戻します。
この例と前提条件のデータ・マイニング操作は、デモ・ファイル$ORACLE_HOME/rdbms/demo/dmglcdem.sql
で確認できます。次に、このファンクションの構文の使用例を示します。データ・マイニングのデモ・ファイルの一般情報は、『Oracle Data Mining管理者ガイド』を参照してください。
SELECT count(cust_id) cust_count, cust_marital_status FROM (SELECT cust_id, cust_marital_status FROM mining_data_apply_v WHERE PREDICTION_BOUNDS(glmr_sh_regr_sample,0.98 USING *).LOWER > 24 AND PREDICTION_BOUNDS(glmr_sh_regr_sample,0.98 USING *).UPPER < 46) GROUP BY cust_marital_status; CUST_COUNT CUST_MARITAL_STATUS -------------- -------------------- 46 NeverM 7 Mabsent 5 Separ. 35 Divorc. 72 Married
このファンクションは、DBMS_DATA_MINING
パッケージまたはOracle Data Mining Java APIで作成した任意の分類モデルで使用するためのものです。また、指定した予測のコストのメジャーをOracleのNUMBER
として戻します。
オプションのclass
パラメータを指定すると、このファンクションは指定したクラスのコストを戻します。class
パラメータを指定しない場合、最適な予測に関連付けられたコストが戻されます。この形式とPREDICTION
ファンクションを組み合せて使用すると、予測値とコストの最適な組合せを取得できます。
COST
句は、すべての分類モデルに対して有効です。
COST
MODEL
を指定します。このようなスコアリングのコスト・マトリックスが存在しない場合は、エラーが戻されます。
COST
MODEL
AUTO
を指定します。このとき、格納されたコスト・マトリックスを使用してコストが戻されます。格納されたコスト・マトリックスが存在しない場合は、単位コスト・マトリックス(対角線上は0の値、それ以外の場所は1の値)が適用されます。これは、1から指定されたクラスの確率を引いた値と同じです。
VALUES
句(cost_matrix_clause
の下の方のブランチ)を使用します。表内コスト・マトリックスは、モデルがスコアリングのコスト・マトリックスに関連付けられているかどうかにかかわらず使用できます。
mining_attribute_clause
は、PREDICTION
ファンクションと同様に動作します。詳細は、「mining_attribute_clause」を参照してください。
次の例では、イタリア在住で、提携カードの使用を薦める上で最もコストが低い顧客を10人検索します。
この例と前提条件のデータ・マイニング操作は、デモ・ファイル$ORACLE_HOME/rdbms/demo/dmdtdemo.sql
で確認できます。データ・マイニングのデモ・ファイルの一般情報は、『Oracle Data Mining管理者ガイド』を参照してください。次に、このファンクションの構文の使用例を示します。
WITH cust_italy AS ( SELECT cust_id FROM mining_data_apply_v WHERE country_name = 'Italy' ORDER BY PREDICTION_COST(DT_SH_Clas_sample, 1 COST MODEL USING *) ASC, 1 ) SELECT cust_id FROM cust_italy WHERE rownum < 11; CUST_ID ---------- 100081 100179 100185 100324 100344 100554 100662 100733 101250 101306 10 rows selected.
このファンクションは、DBMS_DATA_MINING
パッケージまたはOracle Data Mining Java APIで作成した決定ツリー・モデルと単一機能のAdaptive Bayes Network(ABN)モデルで使用するためのものです。このファンクションは、入力行のスコアリングに関連するモデル固有の情報を含むXML文字列を戻します。今回のリリースでは、戻り値は次の書式になります。
<Node id= "integer"/>
ここで、integer
はデータ・マイニングのツリー・ノードの識別子です。出力の形式は、変更される可能性があります。今後のリリースでは、追加の予測情報を提供するように拡張される可能性があります。
mining_attribute_clause
は、PREDICTION
ファンクションと同様に動作します。詳細は、「mining_attribute_clause」を参照してください。
次の例では、DT_SH_Clas_sample
決定ツリー・モデルの関連する予測子であるmining_data_apply_v
ビューから、すべての属性を使用します。テクニカル・サポートで働く25才未満の顧客の場合、DT_SH_Clas_sample
モデルを持つレコードのスコアリングの結果からツリー・ノードが戻されます。
この例と前提条件のデータ・マイニング操作(ビューの作成など)は、デモ・ファイル$ORACLE_HOME/rdbms/demo/dmdtdemo.sql
で確認できます。データ・マイニングのデモ・ファイルの一般情報は、『Oracle Data Mining管理者ガイド』を参照してください。次に、このファンクションの構文の使用例を示します。
SELECT cust_id, education, PREDICTION_DETAILS(DT_SH_Clas_sample using *) treenode FROM mining_data_apply_v WHERE occupation = 'TechSup' AND age < 25 ORDER BY cust_id; CUST_ID EDUCATION TREENODE ---------- --------------------- ------------------------- 100234 < Bach. <Node id="21"/> 100320 < Bach. <Node id="21"/> 100349 < Bach. <Node id="21"/> 100419 < Bach. <Node id="21"/> 100583 < Bach. <Node id="13"/> 100657 HS-grad <Node id="21"/> 101171 < Bach. <Node id="21"/> 101225 < Bach. <Node id="21"/> 101338 < Bach. <Node id="21"/> 9 rows selected.
このファンクションは、DBMS_DATA_MINING
パッケージまたはOracle Data Mining Java APIで作成した分類モデルで使用するためのものです。このファンクションは、他の型のモデルに対しては無効です。また、指定した予測の確率をOracleのNUMBER
として戻します。
オプションのclass
パラメータを指定すると、このファンクションは指定したクラスの確率を戻します。これは、指定したターゲット・クラス値の選択に関連付けられた確率と同じです。
class
パラメータを指定しない場合、最適な予測に関連付けられた確率が戻されます。この形式とPREDICTION
ファンクションを組み合せて使用すると、予測値と確率の最適な組合せを取得できます。
mining_attribute_clause
は、PREDICTION
ファンクションと同様に動作します。詳細は、「mining_attribute_clause」を参照してください。
次の例では、提携カードを使用している可能性が最も高いイタリア在住の顧客を10人戻します。
この例と前提条件のデータ・マイニング操作(ビューの作成など)は、デモ・ファイル$ORACLE_HOME/rdbms/demo/dmdtdemo.sql
で確認できます。データ・マイニングのデモ・ファイルの一般情報は、『Oracle Data Mining管理者ガイド』を参照してください。次に、このファンクションの構文の使用例を示します。
SELECT cust_id FROM ( SELECT cust_id FROM mining_data_apply_v WHERE country_name = 'Italy' ORDER BY PREDICTION_PROBABILITY(DT_SH_Clas_sample, 1 USING *) DESC, cust_id) WHERE rownum < 11; CUST_ID ---------- 100081 100179 100185 100324 100344 100554 100662 100733 101250 101306 10 rows selected.
このファンクションは、DBMS_DATA_MINING
パッケージまたはOracle Data Mining Java APIを使用して作成した分類モデルで使用するためのものです。このファンクションは、他の型のモデルに対しては無効です。このファンクションは、複数クラスの分類の使用例で、すべてのクラスを含むオブジェクトのVARRAYを戻します。オブジェクト・フィールドには、PREDICTION
、PROBABILITY
およびCOST
の名前が付きます。PREDICTION
フィールドのデータ型は、モデルの作成中に使用するターゲット値の型によって異なります。他の2つのフィールドは、両方ともOracleのNUMBER
になります。要素は最適な予測から最低の予測の順序で戻されます。
bestN
には、戻されるターゲット・クラスを最も高い確率(コスト・マトリックス句が指定されている場合は、最も低いコスト)のN
に制限するために、正の整数を指定します。複数のクラスがN番目の値にあっても、N
個の値のみが戻されます。cutoff
のみでフィルタ処理するには、このパラメータにNULL
を指定します。
cutoff
には、戻されるターゲット・クラスを、指定したカットオフ値以上(コスト・マトリックス句が指定されている場合は、指定したコスト以下)の確率を持つターゲット・クラスに制限するために、NUMBER
値を指定します。bestN
にNULL
を指定すると、cutoff
のみでフィルタ処理できます。bestN
とcutoff
の両方に値を指定すると、戻される予測は、bestN
で、かつ確率(またはcost_matrix_clause
指定時のコスト)がしきい値を超えるもののみに制限されます。
cost_matrix_clause
句は、すべての分類モデルに対して有効です。この句を指定すると、bestN
とcutoff
の両方は、予測の確率ではなく予測コストに関して処理されます。bestN
の値は、結果をN
の最適(最低)コストを持つターゲット・クラスに制限し、cutoff
は、ターゲット・クラスを、指定したカットオフ以下のコストを持つターゲット・クラスに制限します。
この句を指定すると、コレクションの各オブジェクトは、予測値を含むスカラー値(データ型はモデルの作成時に使用されるターゲット値の型によって異なる)、予測確率および予測コスト(両方ともOracleのNUMBER
)になります。
この句を指定しない場合、VARRAYの各オブジェクトは、予測値と予測確率を含むスカラーの組になります。戻されるデータ型は、前述の説明と同様です。
COST
MODEL
を指定します。このようなコスト・マトリックスが存在しない場合は、エラーが戻されます。
COST
MODEL
AUTO
を指定します。この場合、次のようになります。
VALUES
句(cost_matrix_clause
の下の方のブランチ)を使用します。表内コスト・マトリックスは、モデルがスコアリングのコスト・マトリックスに関連付けられているかどうかにかかわらず使用できます。
mining_attribute_clause
は、PREDICTION
ファンクションと同様に動作します。詳細は、「mining_attribute_clause」を参照してください。
次の例では、提携カードの使用および不使用の可能性とコストを、10人の顧客それぞれで示します。この例はバイナリ・ターゲットを持ちますが、このような問合せは「Low」、「Med」、「High」などの複数クラスの分類でも有効です。
この例と前提条件のデータ・マイニング操作は、デモ・ファイル$ORACLE_HOME/rdbms/demo/dmdtdemo.sql
で確認できます。データ・マイニングのデモ・ファイルの一般情報は、『Oracle Data Mining管理者ガイド』を参照してください。次に、このファンクションの構文の使用例を示します。
SELECT T.cust_id, S.prediction, S.probability, S.cost FROM (SELECT cust_id, PREDICTION_SET(dt_sh_clas_sample COST MODEL USING *) pset FROM mining_data_apply_v WHERE cust_id < 100011) T, TABLE(T.pset) S ORDER BY cust_id, S.prediction; CUST_ID PREDICTION PROBABILITY COST ---------- ---------- ----------- ----- 100001 0 .96682 .27 100001 1 .03318 .97 100002 0 .74038 2.08 100002 1 .25962 .74 100003 0 .90909 .73 100003 1 .09091 .91 100004 0 .90909 .73 100004 1 .09091 .91 100005 0 .27236 5.82 100005 1 .72764 .27 100006 0 1.00000 .00 100006 1 .00000 1.00 100007 0 .90909 .73 100007 1 .09091 .91 100008 0 .90909 .73 100008 1 .09091 .91 100009 0 .27236 5.82 100009 1 .72764 .27 100010 0 .80808 1.54 100010 1 .19192 .81 20 rows selected.
PRESENTNNV
ファンクションは、SELECT
文のmodel_clause
でのみ、およびモデル・ルールの右側でのみ使用できます。このファンクションは、cell_reference
がmodel_clause
の実行前に存在し、PRESENTNNV
の評価時にNULLではない場合にexpr1
を戻します。それ以外の場合はexpr2
を戻します。このファンクションは、NVL2
とは異なります。NVL2
は、model_clause
の実行前の状態のデータを評価するのではなく、実行時のデータを評価します。
次の例では、2002年のマウス・パッドの売上を含む行が存在し、その売上値がNULLではない場合、その売上値を変更しません。その行が存在し、売上値がNULLの場合、その売上値を10に設定します。その行が存在しない場合、売上値を10に設定して行を作成します。
SELECT country, prod, year, s FROM sales_view_ref MODEL PARTITION BY (country) DIMENSION BY (prod, year) MEASURES (sale s) IGNORE NAV UNIQUE DIMENSION RULES UPSERT SEQUENTIAL ORDER ( s['Mouse Pad', 2002] = PRESENTNNV(s['Mouse Pad', 2002], s['Mouse Pad', 2002], 10) ) ORDER BY country, prod, year; COUNTRY PROD YEAR S ---------- ----------------------------------- -------- --------- France Mouse Pad 1998 2509.42 France Mouse Pad 1999 3678.69 France Mouse Pad 2000 3000.72 France Mouse Pad 2001 3269.09 France Mouse Pad 2002 10 France Standard Mouse 1998 2390.83 France Standard Mouse 1999 2280.45 France Standard Mouse 2000 1274.31 France Standard Mouse 2001 2164.54 Germany Mouse Pad 1998 5827.87 Germany Mouse Pad 1999 8346.44 Germany Mouse Pad 2000 7375.46 Germany Mouse Pad 2001 9535.08 Germany Mouse Pad 2002 10 Germany Standard Mouse 1998 7116.11 Germany Standard Mouse 1999 6263.14 Germany Standard Mouse 2000 2637.31 Germany Standard Mouse 2001 6456.13 18 rows selected.
この例では、ビューsales_view_ref
が必要です。このビューを作成する方法については、「例」を参照してください。
PRESENTV
ファンクションは、SELECT
文のmodel_clause
でのみ、およびモデル・ルールの右側でのみ使用できます。このファンクションは、cell_reference
が存在する場合、model_clause
を実行する前にexpr1
を戻します。それ以外の場合はexpr2
を戻します。
次の例では、2000年のマウス・パッドの売上を含む行が存在する場合、2001年のマウス・パッドの売上を2000年のマウス・パッドの売上値に設定します。その行が存在しない場合、2001年のマウス・パッドの売上値を0(ゼロ)に設定して行を作成します。
SELECT country, prod, year, s FROM sales_view_ref MODEL PARTITION BY (country) DIMENSION BY (prod, year) MEASURES (sale s) IGNORE NAV UNIQUE DIMENSION RULES UPSERT SEQUENTIAL ORDER ( s['Mouse Pad', 2001] = PRESENTV(s['Mouse Pad', 2000], s['Mouse Pad', 2000], 0) ) ORDER BY country, prod, year; COUNTRY PROD YEAR S ---------- ----------------------------------- -------- --------- France Mouse Pad 1998 2509.42 France Mouse Pad 1999 3678.69 France Mouse Pad 2000 3000.72 France Mouse Pad 2001 3000.72 France Standard Mouse 1998 2390.83 France Standard Mouse 1999 2280.45 France Standard Mouse 2000 1274.31 France Standard Mouse 2001 2164.54 Germany Mouse Pad 1998 5827.87 Germany Mouse Pad 1999 8346.44 Germany Mouse Pad 2000 7375.46 Germany Mouse Pad 2001 7375.46 Germany Standard Mouse 1998 7116.11 Germany Standard Mouse 1999 6263.14 Germany Standard Mouse 2000 2637.31 Germany Standard Mouse 2001 6456.13 16 rows selected.
この例では、ビューsales_view_ref
が必要です。このビューを作成する方法については、「MODEL句の例:」を参照してください。
PREVIOUS
ファンクションは、SELECT
文のmodel_clause
でのみ、およびmodel_rules_clause
のITERATE
... [ UNTIL
]
句でのみ使用できます。このファンクションは、各反復の最初にcell_reference
の値を戻します。
次の例では、反復の最初と最後にあるcur_val
の値の差が1未満になるまで、最大1000回ルールを繰り返します。
SELECT dim_col, cur_val, num_of_iterations FROM (SELECT 1 AS dim_col, 10 AS cur_val FROM dual) MODEL DIMENSION BY (dim_col) MEASURES (cur_val, 0 num_of_iterations) IGNORE NAV UNIQUE DIMENSION RULES ITERATE (1000) UNTIL (PREVIOUS(cur_val[1]) - cur_val[1] < 1) ( cur_val[1] = cur_val[1]/2, num_of_iterations[1] = num_of_iterations[1] + 1 ); DIM_COL CUR_VAL NUM_OF_ITERATIONS ---------- ---------- ----------------- 1 .625 4
RANK
は、一連の値における値のランクを計算します。戻り型は、NUMBER
です。
ランク付け基準と同じ値を持つ行は、同じランクになります。Oracle Databaseは連結行の数を連結ランクに追加して、次のランクを計算します。そのため、ランクは連続した数値でない場合があります。このファンクションは、上位N番および下位N番のレポートに有効です。
RANK
は、ファンクションの引数として識別される不確定な行のランクを、指定されたソート指定に従って計算します。ファンクションの引数は、各集計グループの単一行を識別するため、すべての引数は各集計グループ内で定数式に評価される必要があります。定数引数式および集計のORDER
BY
句の式の位置は、一致します。このため、引数の数は同じであり、その型は互換性がある必要があります。
RANK
は、ある問合せが戻す他の行について、その問合せが戻す各行のランクを計算します。この計算は、order_by_clause
にあるvalue_exprs
の値に基づいて行われます。
次の例では、サンプル表hr.employees
から、給与が15,500ドルであり、歩合が5%である不確定な従業員のランクを計算します。
SELECT RANK(15500, .05) WITHIN GROUP (ORDER BY salary, commission_pct) "Rank" FROM employees; Rank ---------- 105
同様に、次の問合せは、従業員の給与から給与が15,500ドルのランクを戻します。
SELECT RANK(15500) WITHIN GROUP (ORDER BY salary DESC) "Rank of 15500" FROM employees; Rank of 15500 -------------- 4
次の例では、サンプル・スキーマhr
の部門80の従業員を、その給与および歩合に基づいてランク付けします。給与が同じ場合は同じランクになるため、連続しないランクになります。この例と、「DENSE_RANK」の例を比較してください。
SELECT department_id, last_name, salary, commission_pct, RANK() OVER (PARTITION BY department_id ORDER BY salary DESC, commission_pct) "Rank" FROM employees WHERE department_id = 80 ORDER BY department_id, last_name, salary, commission_pct, "Rank"; DEPARTMENT_ID LAST_NAME SALARY COMMISSION_PCT Rank ------------- ------------------------- ---------- -------------- ---------- 80 Abel 11000 .3 5 80 Ande 6400 .1 31 80 Banda 6200 .1 32 80 Bates 7300 .15 26 80 Bernstein 9500 .25 14 80 Bloom 10000 .2 9 80 Cambrault 7500 .2 23 80 Cambrault 11000 .3 5 80 Doran 7500 .3 24 80 Errazuriz 12000 .3 3 80 Fox 9600 .2 12 80 Greene 9500 .15 13 80 Hall 9000 .25 16 80 Hutton 8800 .25 18 80 Johnson 6200 .1 32 80 King 10000 .35 11 80 Kumar 6100 .1 34 80 Lee 6800 .1 30 80 Livingston 8400 .2 20 80 Marvins 7200 .1 27 80 McEwen 9000 .35 17 80 Olsen 8000 .2 21 80 Ozer 11500 .25 4 80 Partners 13500 .3 2 80 Russell 14000 .4 1 80 Sewall 7000 .25 29 80 Smith 7400 .15 25 80 Smith 8000 .3 22 80 Sully 9500 .35 15 80 Taylor 8600 .2 19 80 Tucker 10000 .3 10 80 Tuvault 7000 .15 28 80 Vishney 10500 .25 8 80 Zlotkey 10500 .2 7
RATIO_TO_REPORT
は分析ファンクションです。このファンクションは、ある値の集合の合計に対する、その値の比率を計算します。expr
がNULLの場合は、値もNULLになります。
値の集合は、query_partition_clause
によって決まります。この句を省略すると、比率は、問合せによって戻されるすべての行で計算されます。
expr
には、RATIO_TO_REPORT
または他の分析ファンクションを使用して分析ファンクションをネストできません。ただし、他の組込みファンクション式をexpr
で使用できます。expr
の書式の詳細は、「SQL式」を参照してください。
次の例では、すべての事務員の給与の合計に対する各事務員の給与の割合の値を計算します。
SELECT last_name, salary, RATIO_TO_REPORT(salary) OVER () AS rr FROM employees WHERE job_id = 'PU_CLERK' ORDER BY last_name, salary, rr; LAST_NAME SALARY RR ------------------------- ---------- ---------- Baida 2900 .208633094 Colmenares 2500 .179856115 Himuro 2600 .18705036 Khoo 3100 .223021583 Tobias 2800 .201438849
RAWTOHEX
は、raw
を16進表記で表した文字値に変換します。
SQL組込みファンクションとして使用される場合、RAWTOHEX
は、LONG
、LONG
RAW
、CLOB
、BLOB
またはBFILE
以外のすべてのスカラー・データ型の引数を取ります。このファンクションは、raw
の値を構成するバイトの16進表記でVARCHAR2
値を戻します。各バイトは、2桁の16進数で表されます。
次の例は、RAW
列の値に等しい16進を戻します。
SELECT RAWTOHEX(raw_column) "Graphics" FROM graphics; Graphics -------- 7D
RAWTONHEX
は、raw
を16進表記で表した文字値に変換します。RAWTONHEX
(raw
)は、TO_NCHAR
(RAWTOHEX
(raw
))と同じです。戻り値は、常に各国語キャラクタ・セットです。
次の例は、RAW
列の値に等しい16進を戻します。
SELECT RAWTONHEX(raw_column), DUMP ( RAWTONHEX (raw_column) ) "DUMP" FROM graphics; RAWTONHEX(RA) DUMP ----------------------- ------------------------------ 7D Typ=1 Len=4: 0,55,0,68
REF
は、引数としてオブジェクト表またはオブジェクト・ビューの行に関連付けられた相関変数(表別名)を取ります。変数または行にバインドされたオブジェクト・インスタンスについてのREF
値が戻ります。
サンプル・スキーマoe
には、次のように定義されたcust_address_typ
という型が含まれます。
Attribute Type ----------------------------- ---------------- STREET_ADDRESS VARCHAR2(40) POSTAL_CODE VARCHAR2(10) CITY VARCHAR2(30) STATE_PROVINCE VARCHAR2(10) COUNTRY_ID CHAR(2)
次の例では、サンプル型oe.cust_address_typ
に基づく表(addresses表)を作成した後、その表に行を挿入し、その表からその型のオブジェクト・インスタンスのREF
値を取り出します。
CREATE TABLE addresses OF cust_address_typ; INSERT INTO addresses VALUES ( '123 First Street', '4GF H1J', 'Our Town', 'Ourcounty', 'US'); SELECT REF(e) FROM addresses e; REF(E) ----------------------------------------------------------------------------------- 00002802097CD1261E51925B60E0340800208254367CD1261E51905B60E034080020825436010101820000
REFTOHEX
は、引数expr
を16進で表した文字値に変換します。expr
は、REF
を戻す必要があります。
サンプル・スキーマoe
にはwarehouse_typ
が含まれています。次の例では、その型を基に、ある列のREF
値をそれに等しい16進を含む文字値に変換する方法を示します。
CREATE TABLE warehouse_table OF warehouse_typ (PRIMARY KEY (warehouse_id)); CREATE TABLE location_table (location_number NUMBER, building REF warehouse_typ SCOPE IS warehouse_table); INSERT INTO warehouse_table VALUES (1, 'Downtown', 99); INSERT INTO location_table SELECT 10, REF(w) FROM warehouse_table w; SELECT REFTOHEX(building) FROM location_table; REFTOHEX(BUILDING) -------------------------------------------------------------------------- 0000220208859B5E9255C31760E034080020825436859B5E9255C21760E034080020825436
REGEXP_COUNT
は、ソース文字列でパターンが発生した回数を戻すことによって、REGEXP_INSTR
ファンクションの機能を補完します。このファンクションは、入力キャラクタ・セットによって定義された文字を使用して、文字列を評価します。また、pattern
の発生回数を示す整数を戻します。一致する値が見つからない場合は0(ゼロ)を戻します。
source_char
は、検索値として使用される文字式です。これは通常は文字列であり、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。
pattern
は正規表現です。これは通常はテキスト・リテラルであり、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
データ型です。最大512バイトを指定できます。pattern
のデータ型がsource_char
のデータ型と異なる場合、Oracle Databaseはpattern
をsource_char
のデータ型に変換します。REGEXP_COUNT
は、pattern
内の部分正規表現のカッコを無視します。たとえば、パターン'(123(45))'
は、'12345'
と同じです。pattern
で指定できる演算子のリストは、付録C「Oracleの正規表現のサポート」を参照してください。
position
は、Oracleが検索を開始する文字source_char
の位置を示す正の整数です。デフォルトは1で、source_char
の最初の文字から検索が開始されます。1番目のpattern
の出現が検出されると、その後に続く文字以降の2番目の出現が検索されます。
match_param
は、ファンクションのデフォルトの検索動作を変更するためのテキスト・リテラルです。match_param
には次の値を1つ以上指定できます。
'i'
: 大/小文字を区別せずに検索します。
'c'
: 大/小文字を区別して検索します。
'n'
: 任意の文字に一致する文字であるピリオド(.)を、改行文字の一致に使用します。このパラメータを指定しない場合、ピリオドは改行文字には一致しません。
'm'
: ソース文字列を複数行として処理します。Oracleは、キャレット(^
)およびドル記号($
)を、それぞれ、ソース文字列全体の開始または終了としてのみではなく、ソース文字列内の任意の場所にある任意の行の開始または終了としても解釈します。このパラメータを指定しない場合、Oracleはソース文字列を単一行として処理します。
'x'
は空白文字を無視します。デフォルトでは、空白文字は空白文字として一致します。
複数の矛盾する値を指定すると、最後の値が使用されます。たとえば、'ic'
を指定すると、大/小文字を区別する検索が行われます。前述以外の文字を指定すると、エラーが戻されます。
match_param
を指定しない場合、次のようになります。
次の例では、pattern内の部分正規表現のカッコが無視されることを示します。
SELECT REGEXP_COUNT('123123123123123', '(12)3', 1, 'i') REGEXP_COUNT FROM DUAL; REGEXP_COUNT ------------ 5
次の例では、ファンクションは3番目の文字でソース文字列の評価を開始するため、patternの最初の出現はスキップされます。
SELECT REGEXP_COUNT('123123123123', '123', 3, 'i') COUNT FROM DUAL; COUNT ---------- 3
REGEXP_INSTR
は、正規表現パターンで文字列を検索できるようにINSTR
の機能を拡張したものです。このファンクションは、入力キャラクタ・セットによって定義された文字を使用して、文字列を評価します。また、return_option
引数の値に基づいて、一致したサブストリングの開始位置または終了位置を示す整数を戻します。一致する値が見つからない場合は0(ゼロ)を戻します。
このファンクションは、POSIX正規表現規格およびUnicode Regular Expression Guidelinesに準拠しています。詳細は、付録C「Oracleの正規表現のサポート」を参照してください。
source_char
は、検索値として使用される文字式です。これは通常は文字列であり、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。
pattern
は正規表現です。これは通常はテキスト・リテラルであり、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
データ型です。最大512バイトを指定できます。pattern
のデータ型がsource_char
のデータ型と異なる場合、Oracle Databaseはpattern
をsource_char
のデータ型に変換します。pattern
で指定できる演算子のリストは、付録C「Oracleの正規表現のサポート」を参照してください。
position
は、Oracleが検索を開始する文字source_char
の位置を示す正の整数です。デフォルトは1で、source_char
の最初の文字から検索が開始されます。
occurrence
は、source_char
に出現するpattern
のうちのどれを検索するかを示す正の整数です。デフォルトは1で、最初に出現するpattern
が検索されます。occurrence
が1より大きい場合、1番目のpattern
が検出された後に続く1文字目から、2番目(以降)の出現を検索します。この動作は、最初の出現の2番目の文字から2番目の出現を検索するINSTR
ファンクションとは異なります。
return_option
には、出現した文字と関連して戻すものを指定できます。
match_parameter
は、ファンクションのデフォルトの検索動作を変更するためのテキスト・リテラルです。このパラメータの動作は、REGEXP_COUNT
のこのファンクションの動作と同じです。詳細は、「REGEXP_COUNT」を参照してください。
pattern
の場合、subexpr
は、ファンクションのターゲットとなるpattern
内の部分正規表現を示す0から9までの整数になります。subexpr
は、カッコで囲まれたpatternのフラグメントです。部分正規表現はネストできます。部分正規表現は、その左側のカッコがpatternに出現する順に番号付けされます。たとえば、次の正規表現を考えます。
0123(((abc)(de)f)ghi)45(678)
この正規表現には、abcdefghi、abcdef、abc、de、678の順に5つの部分正規表現があります。
subexpr
が0(ゼロ)の場合、pattern
に一致するサブストリング全体の位置が戻されます。subexpr
が0(ゼロ)より大きい場合、一致したサブストリング内の部分正規表現番号subexpr
に対応するサブストリング・フラグメントの位置が戻されます。pattern
にsubexpr
の部分正規表現が1つもない場合、このファンクションは0(ゼロ)を戻します。NULLのsubexpr
値は、NULL
を戻します。subexpr
のデフォルト値は0(ゼロ)です。
次の例では、文字列を調べて、空白以外の文字を検索します。Oracleは、文字列の最初の文字から検索を開始し、空白以外の文字が6つ目に出現する開始位置(デフォルト)を戻します。
SELECT REGEXP_INSTR('500 Oracle Parkway, Redwood Shores, CA', '[^ ]+', 1, 6) "REGEXP_INSTR" FROM DUAL; REGEXP_INSTR ------------ 37
次の例では、文字列を調べて、大/小文字を区別せずにs
、r
またはp
で始まり、任意の6つのアルファベット文字が続く単語を検索します。Oracleは、文字列の3つ目の文字から検索を開始し、大文字か小文字のs
、r
またはp
で始まる7文字の単語が2つ目に出現した後の文字の、文字列内の位置を戻します。
SELECT REGEXP_INSTR('500 Oracle Parkway, Redwood Shores, CA', '[s|r|p][[:alpha:]]{6}', 3, 2, 1, 'i') "REGEXP_INSTR" FROM DUAL; REGEXP_INSTR ------------ 28
次の例では、subexpr
引数を使用してpattern
内の特定の部分正規表現を検索します。最初の文は、最初の部分正規表現にある最初の文字のソース文字列(123)の位置を戻します。
SELECT REGEXP_INSTR('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 1) "REGEXP_INSTR" FROM DUAL; REGEXP_INSTR ------------------- 1
次の文は、2番目の部分正規表現にある最初の文字のソース文字列(45678)の位置を戻します。
SELECT REGEXP_INSTR('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 2) "REGEXP_INSTR" FROM DUAL; REGEXP_INSTR ------------------- 4
次の文は、4番目の部分正規表現にある最初の文字のソース文字列(78)の位置を戻します。
SELECT REGEXP_INSTR('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 4) "REGEXP_INSTR" FROM DUAL; REGEXP_INSTR ------------------- 7
REGEXP_REPLACE
は、正規表現パターンで文字列を検索できるようにREPLACE
の機能を拡張したものです。デフォルトでは、このファンクションは、正規表現パターンに一致するすべての文字をreplace_string
に置き換えてsource_char
を戻します。source_char
と同じキャラクタ・セットの文字列が戻されます。このファンクションは、1つ目の引数がLOBではない場合はVARCHAR2
を戻し、1つ目の引数がLOBの場合はCLOB
を戻します。
このファンクションは、POSIX正規表現規格およびUnicode Regular Expression Guidelinesに準拠しています。詳細は、付録C「Oracleの正規表現のサポート」を参照してください。
source_char
は、検索値として使用される文字式です。これは通常は文字列であり、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。
pattern
は正規表現です。これは通常はテキスト・リテラルであり、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
データ型です。最大512バイトを指定できます。pattern
のデータ型がsource_char
のデータ型と異なる場合、Oracle Databaseはpattern
をsource_char
のデータ型に変換します。pattern
で指定できる演算子のリストは、付録C「Oracleの正規表現のサポート」を参照してください。
replace_string
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。replace_string
がCLOB
またはNCLOB
の場合、replace_string
は32KBに切り捨てられます。replace_string
には、最大500個の部分正規表現への後方参照を\n
という書式で指定できます。n
は、1〜9の数値です。replace_string
内でn
がバックスラッシュ文字に評価される場合、その前にエスケープ文字(\\
)を付ける必要があります。後方参照表現の詳細は、「Oracleの正規表現のサポート」の表C-1に示す説明を参照してください。
position
は、Oracleが検索を開始する文字source_char
の位置を示す正の整数です。デフォルトは1で、source_char
の最初の文字から検索が開始されます。
occurrence
は、置換操作の対象となる文字を示す、負ではない整数です。
occurrence
が1より大きい場合、1番目のpattern
が検出された後に続く1文字目から、2番目(以降)の出現を検索します。この動作は、最初の出現の2番目の文字から2番目の出現を検索するINSTR
ファンクションとは異なります。
match_parameter
は、ファンクションのデフォルトの検索動作を変更するためのテキスト・リテラルです。このパラメータの動作は、REGEXP_COUNT
のこのファンクションの動作と同じです。詳細は、「REGEXP_COUNT」を参照してください。次の例では、phone_number
を調べて、xxx
.xxx
.xxxx
というパターンを検索します。その後、このパターンを(xxx
) xxx
-xxxx
という書式に変更します。
SELECT REGEXP_REPLACE(phone_number, '([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})', '(\1) \2-\3') "REGEXP_REPLACE" FROM employees ORDER BY "REGEXP_REPLACE"; REGEXP_REPLACE -------------------------------------------------------------------------------- (515) 123-4444 (515) 123-4567 (515) 123-4568 (515) 123-4569 (515) 123-5555 . . .
次の例では、country_name
を調べます。文字列内のNULLでない各文字の後に空白を挿入します。
SELECT REGEXP_REPLACE(country_name, '(.)', '\1 ') "REGEXP_REPLACE" FROM countries; REGEXP_REPLACE -------------------------------------------------------------------------------- A r g e n t i n a A u s t r a l i a B e l g i u m B r a z i l C a n a d a . . .
次の例では、文字列を調べて、2つ以上の空白を検索します。検索された2つ以上の空白を、それぞれ1つの空白に置換します。
SELECT REGEXP_REPLACE('500 Oracle Parkway, Redwood Shores, CA', '( ){2,}', ' ') "REGEXP_REPLACE" FROM DUAL; REGEXP_REPLACE -------------------------------------- 500 Oracle Parkway, Redwood Shores, CA
REGEXP_SUBSTR
は、正規表現パターンで文字列を検索できるようにSUBSTR
の機能を拡張したものです。REGEXP_INSTR
と似ていますが、REGEXP_INSTR
はサブストリングの位置ではなくサブストリング自体を戻します。このファンクションは、一致文字列の内容のみが必要で、ソース文字列内での位置は必要ない場合に有効です。このファンクションは、文字列をVARCHAR2
またはCLOB
データとして、source_char
と同じキャラクタ・セットで戻します。
このファンクションは、POSIX正規表現規格およびUnicode Regular Expression Guidelinesに準拠しています。詳細は、付録C「Oracleの正規表現のサポート」を参照してください。
source_char
は、検索値として使用される文字式です。これは通常は文字列であり、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。
pattern
は正規表現です。これは通常はテキスト・リテラルであり、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
データ型です。最大512バイトを指定できます。pattern
のデータ型がsource_char
のデータ型と異なる場合、Oracle Databaseはpattern
をsource_char
のデータ型に変換します。pattern
で指定できる演算子のリストは、付録C「Oracleの正規表現のサポート」を参照してください。
position
は、Oracleが検索を開始する文字source_char
の位置を示す正の整数です。デフォルトは1で、source_char
の最初の文字から検索が開始されます。
occurrence
は、source_char
に出現するpattern
のうちのどれを検索するかを示す正の整数です。デフォルトは1で、最初に出現するpattern
が検索されます。occurrence
が1より大きい場合、1番目のpattern
が検出された後に続く1文字目から、2番目(以降)の出現を検索します。この動作は、最初の出現の2番目の文字から2番目の出現を検索するSUBSTR
ファンクションとは異なります。
match_parameter
は、ファンクションのデフォルトの検索動作を変更するためのテキスト・リテラルです。このパラメータの動作は、REGEXP_COUNT
のこのファンクションの動作と同じです。詳細は、「REGEXP_COUNT」を参照してください。
pattern
の場合、subexpr
は、ファンクションによって戻されるpattern
内の部分正規表現を示す0から9までの負でない整数になります。このパラメータは、REGEXP_INSTR
ファンクションの場合と同じセマンティクスを持ちます。詳細は、「REGEXP_INSTR」を参照してください。次の例では、文字列を調べて、カンマで区切られた最初のサブストリングを検索します。Oracle Databaseは、後にカンマが付いているカンマでない1つ以上の文字の前にあるカンマを検索します。該当するサブストリングが、前後のカンマを含めて戻されます。
SELECT REGEXP_SUBSTR('500 Oracle Parkway, Redwood Shores, CA', ',[^,]+,') "REGEXPR_SUBSTR" FROM DUAL; REGEXPR_SUBSTR ----------------- , Redwood Shores,
次の例では、文字列を調べて、1つ以上の英数字を含むサブストリング、および任意でピリオド(.
)が続くhttp://
を検索します。Oracleは、http://
と、スラッシュ(/
)または文字列の末尾のいずれかとの間で、3〜4つのこのサブストリングを検索します。
SELECT REGEXP_SUBSTR('http://www.example.com/products', 'http://([[:alnum:]]+\.?){3,4}/?') "REGEXP_SUBSTR" FROM DUAL; REGEXP_SUBSTR ---------------------- http://www.example.com/
次の2つの例では、subexpr
引数を使用してpattern
内の特定の部分正規表現を戻します。最初の文は、pattern
内の最初の部分正規表現を戻します。
SELECT REGEXP_SUBSTR('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 1) "REGEXP_SUBSTR" FROM DUAL; REGEXP_SUBSTR ------------------- 123
次の文は、pattern
内の4番目の部分正規表現を戻します。
SELECT REGEXP_SUBSTR('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 4) "REGEXP_SUBSTR" FROM DUAL; REGEXP_SUBSTR ------------------- 78
線形回帰ファンクションは次のとおりです。
線形回帰ファンクションは、微分最小2乗法で求めた回帰直線を数値の組の集合に対応付けます。これは、集計ファンクションまたは分析ファンクションとして使用できます。
これらのファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。Oracleは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。
Oracleは、expr1
またはexpr2
がNULLであるすべての組を排除した後、このファンクションを(expr1
, expr2
)の集合に適用します。Oracleは、データでの引渡し中、同時にすべての回帰ファンクションを計算します。
expr1
は、従属変数の値(y
値)として解析されます。expr2
は、独立変数の値(x
値)として解析されます。
REGR_SLOPE
は、直線の傾きを戻します。戻り値は数値データ型で、NULLになる場合もあります。NULL (expr1, expr2
)の組を排除した後、このファンクションは次の計算を行います。
COVAR_POP(expr1, expr2) / VAR_POP(expr2)
REGR_INTERCEPT
は、回帰ファンクションのy切片を戻します。戻り値は数値データ型で、NULLになる場合もあります。NULL (expr1, expr2
)の組を排除した後、このファンクションは次の計算を行います。
AVG(expr1) - REGR_SLOPE(expr1, expr2) * AVG(expr2)
REGR_COUNT
は整数を戻します。この整数は、回帰ファンクションに適応させるために使用されるNULLでない数値の組です。
REGR_R2
は、回帰に対する決定係数(Rの2乗または適合度とも呼ぶ)を戻します。戻り値は数値データ型で、NULLになる場合もあります。VAR_POP
(expr1
)およびVAR_POP
(expr2
)は、NULLの組が排除された後に評価されます。戻り値は次のとおりです。
NULL if VAR_POP(expr2) = 0 1 if VAR_POP(expr1) = 0 and VAR_POP(expr2) != 0 POWER(CORR(expr1,expr),2) if VAR_POP(expr1) > 0 and VAR_POP(expr2 != 0
これ以外のすべての回帰ファンクションの戻り値は数値データ型で、NULLになる場合もあります。
REGR_AVGX
は、回帰直線の独立変数(expr2
)の平均を求めます。NULL (expr1
、expr2
)の組を排除した後、このファンクションは次の計算を行います。
AVG(expr2)
REGR_AVGY
は、回帰直線の従属変数(expr1
)の平均を求めます。NULL (expr1
、expr2
)の組を排除した後、このファンクションは次の計算を行います。
AVG(expr1)
REGR_SXY
、REGR_SXX
、REGR_SYY
は補助ファンクションです。これらは、様々な診断統計の計算に使用されます。
expr1
、expr2
)の組を排除した後、REGR_SXX
は次の計算を行います。
REGR_COUNT(expr1, expr2) * VAR_POP(expr2)
expr1
、expr2
)の組を排除した後、REGR_SYY
は次の計算を行います。
REGR_COUNT(expr1, expr2) * VAR_POP(expr1)
expr1
、expr2
)の組を排除した後、REGR_SXY
は次の計算を行います。
REGR_COUNT(expr1, expr2) * COVAR_POP(expr1, expr2)
次の例は、サンプル表sh.sales
およびsh.products
に基づいています。
次の例では、分析書式で使用される様々な線形回帰ファンクションを比較します。これらのファンクションの分析書式は、モデル別で従業員ごとに予測される給与の検索などの計算で、回帰統計を使用する場合に有効です。次の個々の線形回帰ファンクションについての項では、これらのファンクションの集計書式の例を示します。
SELECT job_id, employee_id ID, salary, REGR_SLOPE(SYSDATE-hire_date, salary) OVER (PARTITION BY job_id) slope, REGR_INTERCEPT(SYSDATE-hire_date, salary) OVER (PARTITION BY job_id) intcpt, REGR_R2(SYSDATE-hire_date, salary) OVER (PARTITION BY job_id) rsqr, REGR_COUNT(SYSDATE-hire_date, salary) OVER (PARTITION BY job_id) count, REGR_AVGX(SYSDATE-hire_date, salary) OVER (PARTITION BY job_id) avgx, REGR_AVGY(SYSDATE-hire_date, salary) OVER (PARTITION BY job_id) avgy FROM employees WHERE department_id in (50, 80) ORDER BY job_id, employee_id; JOB_ID ID SALARY SLOPE INTCPT RSQR COUNT AVGX AVGY ---------- ----- ---------- ----- --------- ----- ------ ---------- --------- SA_MAN 145 14000 .355 -1707.035 .832 5 12200.000 2626.589 SA_MAN 146 13500 .355 -1707.035 .832 5 12200.000 2626.589 SA_MAN 147 12000 .355 -1707.035 .832 5 12200.000 2626.589 SA_MAN 148 11000 .355 -1707.035 .832 5 12200.000 2626.589 SA_MAN 149 10500 .355 -1707.035 .832 5 12200.000 2626.589 SA_REP 150 10000 .257 404.763 .647 29 8396.552 2561.244 SA_REP 151 9500 .257 404.763 .647 29 8396.552 2561.244 SA_REP 152 9000 .257 404.763 .647 29 8396.552 2561.244 SA_REP 153 8000 .257 404.763 .647 29 8396.552 2561.244 SA_REP 154 7500 .257 404.763 .647 29 8396.552 2561.244 SA_REP 155 7000 .257 404.763 .647 29 8396.552 2561.244 SA_REP 156 10000 .257 404.763 .647 29 8396.552 2561.244 ...
次の例では、サンプル表hr.employees
を使用して、勤務時間(SYSDATE
- hire_date
)と給与に関する線形回帰モデルの傾きと回帰を計算します。結果はjob_id
別にグループ化されます。
SELECT job_id, REGR_SLOPE(SYSDATE-hire_date, salary) slope, REGR_INTERCEPT(SYSDATE-hire_date, salary) intercept FROM employees WHERE department_id in (50,80) GROUP BY job_id ORDER BY job_id; JOB_ID SLOPE INTERCEPT ---------- ----- ------------ SA_MAN .355 -1707.030762 SA_REP .257 404.767151 SH_CLERK .745 159.015293 ST_CLERK .904 134.409050 ST_MAN .479 -570.077291
次の例では、サンプル表hr.employees
を使用して、勤務時間(SYSDATE
- hire_date
)と給与について、job_id
別の数を計算します。結果はjob_id
別にグループ化されます。
SELECT job_id, REGR_COUNT(SYSDATE-hire_date, salary) count FROM employees WHERE department_id in (30, 50) GROUP BY job_id ORDER BY job_id, count; JOB_ID COUNT ---------- ---------- PU_CLERK 5 PU_MAN 1 SH_CLERK 20 ST_CLERK 20 ST_MAN 5
次の例では、サンプル表hr.employees
を使用して、勤務時間(SYSDATE
- hire_date
)と給与の線形回帰に対する決定係数を計算します。
SELECT job_id, REGR_R2(SYSDATE-hire_date, salary) Regr_R2 FROM employees WHERE department_id in (80, 50) GROUP by job_id ORDER BY job_id, Regr_R2; JOB_ID REGR_R2 ---------- ---------- SA_MAN .83244748 SA_REP .647007156 SH_CLERK .879799698 ST_CLERK .742808493 ST_MAN .69418508
次の例では、サンプル表hr.employees
を使用して、勤務時間(SYSDATE
- hire_date
)と給与の平均値を計算します。結果はjob_id
別にグループ化されます。
SELECT job_id, REGR_AVGY(SYSDATE-hire_date, salary) avgy, REGR_AVGX(SYSDATE-hire_date, salary) avgx FROM employees WHERE department_id in (30,50) GROUP BY job_id ORDER BY job_id, avgy, avgx; JOB_ID AVGY AVGX ---------- ---------- ---------- PU_CLERK 2950.3778 2780 PU_MAN 4026.5778 11000 SH_CLERK 2773.0778 3215 ST_CLERK 2872.7278 2785 ST_MAN 3140.1778 7280
次の例では、サンプル表hr.employees
を使用して、勤務時間(SYSDATE
- hire_date
)と給与の線形回帰について、3種類の診断統計を計算します。
SELECT job_id, REGR_SXY(SYSDATE-hire_date, salary) regr_sxy, REGR_SXX(SYSDATE-hire_date, salary) regr_sxx, REGR_SYY(SYSDATE-hire_date, salary) regr_syy FROM employees WHERE department_id in (80, 50) GROUP BY job_id ORDER BY job_id; JOB_ID REGR_SXY REGR_SXX REGR_SYY ---------- ---------- ----------- ---------- SA_MAN 3303500 9300000.0 1409642 SA_REP 16819665.5 65489655.2 6676562.55 SH_CLERK 4248650 5705500.0 3596039 ST_CLERK 3531545 3905500.0 4299084.55 ST_MAN 2180460 4548000.0 1505915.2
REMAINDER
はn2
をn1
で割った余りを戻します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。Oracleは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。
MOD
ファンクションはREMAINDER
と似ていますが、MOD
の式ではFLOOR
を使用します。これに対してREMAINDER
ではROUNDを使用します。詳細は、「MOD」を参照してください。
n1
が0(ゼロ)であるか、またはn2
が無限大の場合、Oracleが戻すものは次のようになります。
n1
が0ではない場合、余りはn2
- (n1
*N
)となります。N
は、n2
/n1
に最も近い整数です。n2
/n1
がx.5
と等しい場合、N
は最も近い偶数の整数です。
n2
が浮動小数点数で、余りが0(ゼロ)の場合、余りの符号はn2
の符合になります。NUMBER
値の場合、0の余りには符号は付きません。
次の例では、「例」で作成されたfloat_point_demo
表を使用して、2つの浮動小数点数を割り、算出された余りを戻します。
SELECT bin_float, bin_double, REMAINDER(bin_float, bin_double) FROM float_point_demo; BIN_FLOAT BIN_DOUBLE REMAINDER(BIN_FLOAT,BIN_DOUBLE) ---------- ---------- ------------------------------- 1.235E+003 1.235E+003 5.859E-005
REPLACE
は、replacement_string
ですべてのsearch_string
を変換してchar
を戻します。replacement_string
を指定しない場合またはNULLの場合、すべてのsearch_string
が削除されます。search_string
がNULLの場合、char
が戻されます。
char
と同様に、search_string
およびreplacement_string
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。char
と同じキャラクタ・セットの文字列が戻されます。このファンクションは、1つ目の引数がLOBではない場合はVARCHAR2
を戻し、1つ目の引数がLOBの場合はCLOB
を戻します。
REPLACE
は、TRANSLATE
ファンクションに関連する機能を提供します。TRANSLATE
は、単一文字を1対1で置き換えます。REPLACE
ファンクションでは、1つの文字列の置換および複数の文字列の削除を実行できます。
次の例では、J
をBL
に置換します。
SELECT REPLACE('JACK and JUE','J','BL') "Changes" FROM DUAL; Changes -------------- BLACK and BLUE
ROUND
は、n
を小数点以下integer
桁に丸めた値を戻します。integer
を指定しない場合、n
は小数点以下が丸められます。integer
が負の場合、n
は小数点の左側に丸められます。
n
には、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を指定できます。integer
を指定しない場合、このファンクションは、n
の数値データ型と同じデータ型で値ROUND
(n, 0)を戻します。integer
を指定すると、このファンクションはNUMBER
を戻します。
ROUND
は、次の規則を使用して実行されます。
n
が0の場合、ROUND
はinteger
に関係なく常に0を戻します。
n
が負の場合、ROUND
(n, integer)は、-ROUND
(-n, integer)を戻します。
n
が正の場合は、次のとおりです。
ROUND(n, integer) = FLOOR(n * POWER(10, integer) + 0.5) * POWER(10, -integer)
NUMBER
値に適用されたROUND
が、浮動小数点で表現された同じ値に適用されたROUND
と少し異なる場合があります。この結果の相違は、NUMBER
と浮動小数点値の内部表現の違いから発生します。相違が発生した場合、その相違は丸められた桁で1になります。
参照:
暗黙的な変換の詳細は、表2-10「暗黙的な型変換のマトリックス」を参照してください。Oracle Databaseによる |
次の例では、数値を小数点以下1桁に丸めます。
SELECT ROUND(15.193,1) "Round" FROM DUAL; Round ---------- 15.2
次の例では、数値の小数点の左1桁を丸めます。
SELECT ROUND(15.193,-1) "Round" FROM DUAL; Round ---------- 20
ROUND
は、date
を書式モデルfmt
で指定した単位に丸めた結果を戻します。このファンクションは、NLS_CALENDAR
セッション・パラメータの影響を受けません。このファンクションはグレゴリオ暦の規則に従って動作します。戻される値は、date
に異なる日時データ型を指定した場合でも、常にDATE
データ型です。fmt
を省略すると、date
は最も近い日に丸められます。date
式は、DATE
値に変換される必要があります。
次の例では、次の年の最も近い日に丸めます。
SELECT ROUND (TO_DATE ('27-OCT-00'),'YEAR') "New Year" FROM DUAL; New Year --------- 01-JAN-01
ROW_NUMBER
は分析ファンクションです。このファンクションは、order_by_clause
に指定された行の、1から始まる順序シーケンスで、このファンクションが適用される各行(パーティションの各行、または問合せが戻す各行)に一意の数値を割り当てます。
指定された範囲のROW_NUMBER
値を取得する問合せ内に、ROW_NUMBER
を使用した副問合せをネストすることで、内側の問合せの結果から正確な行のサブセットを得ることができます。この方法でこのファンクションを使用すると、上位N番、下位N番および内部N番のレポートを実行できます。一貫した結果を戻すには、問合せで決定的なソート順序を使用する必要があります。
expr
には、ROW_NUMBER
または他の分析ファンクションを使用して分析ファンクションをネストできません。ただし、他の組込みファンクション式をexpr
で使用できます。expr
の書式の詳細は、「SQL式」を参照してください。
次の例では、hr.employees
表で各部門の最も支給額の高い上位3人の従業員を検索します。従業員が3人未満の部門については、3行未満の行が戻されます。
SELECT department_id, first_name, last_name, salary FROM ( SELECT department_id, first_name, last_name, salary, ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary desc) rn FROM employees ) WHERE rn <= 3 ORDER BY department_id, salary DESC, last_name;
次の例は、sh.sales
表の結合問合せです。1999年の売上高が上位5つの製品について2000年の売上高を検索し、2000年と1999年の差を比較します。各販売チャネルにおいて売上高上位の10製品が計算されます。
SELECT sales_2000.channel_desc, sales_2000.prod_name, sales_2000.amt amt_2000, top_5_prods_1999_year.amt amt_1999, sales_2000.amt - top_5_prods_1999_year.amt amt_diff FROM /* The first subquery finds the 5 top-selling products per channel in year 1999. */ (SELECT channel_desc, prod_name, amt FROM ( SELECT channel_desc, prod_name, sum(amount_sold) amt, ROW_NUMBER () OVER (PARTITION BY channel_desc ORDER BY SUM(amount_sold) DESC) rn FROM sales, times, channels, products WHERE sales.time_id = times.time_id AND times.calendar_year = 1999 AND channels.channel_id = sales.channel_id AND products.prod_id = sales.prod_id GROUP BY channel_desc, prod_name ) WHERE rn <= 5 ) top_5_prods_1999_year, /* The next subquery finds sales per product and per channel in 2000. */ (SELECT channel_desc, prod_name, sum(amount_sold) amt FROM sales, times, channels, products WHERE sales.time_id = times.time_id AND times.calendar_year = 2000 AND channels.channel_id = sales.channel_id AND products.prod_id = sales.prod_id GROUP BY channel_desc, prod_name ) sales_2000 WHERE sales_2000.channel_desc = top_5_prods_1999_year.channel_desc AND sales_2000.prod_name = top_5_prods_1999_year.prod_name ORDER BY sales_2000.channel_desc, sales_2000.prod_name ; CHANNEL_DESC PROD_NAME AMT_2000 AMT_1999 AMT_DIFF --------------- --------------==-------------------------------- ---------- ---------- ---------- Direct Sales 17" LCD w/built-in HDTV Tuner 628855.7 1163645.78 -534790.08 Direct Sales Envoy 256MB - 40GB 502938.54 843377.88 -340439.34 Direct Sales Envoy Ambassador 2259566.96 1770349.25 489217.71 Direct Sales Home Theatre Package with DVD-Audio/Video Play 1235674.15 1260791.44 -25117.29 Direct Sales Mini DV Camcorder with 3.5" Swivel LCD 775851.87 1326302.51 -550450.64 Internet 17" LCD w/built-in HDTV Tuner 31707.48 160974.7 -129267.22 Internet 8.3 Minitower Speaker 404090.32 155235.25 248855.07 Internet Envoy 256MB - 40GB 28293.87 154072.02 -125778.15 Internet Home Theatre Package with DVD-Audio/Video Play 155405.54 153175.04 2230.5 Internet Mini DV Camcorder with 3.5" Swivel LCD 39726.23 189921.97 -150195.74 Partners 17" LCD w/built-in HDTV Tuner 269973.97 325504.75 -55530.78 Partners Envoy Ambassador 1213063.59 614857.93 598205.66 Partners Home Theatre Package with DVD-Audio/Video Play 700266.58 520166.26 180100.32 Partners Mini DV Camcorder with 3.5" Swivel LCD 404265.85 520544.11 -116278.26 Partners Unix/Windows 1-user pack 374002.51 340123.02 33879.49 15 rows selected.
ROWIDTOCHAR
は、ROWIDの値をVARCHAR2
データ型に変換します。この変換の結果は常に18文字です。
次の例では、employees
表のROWID値を文字値に変換します。(結果はサンプル・データベースのビルドごとに異なります。)
SELECT ROWID FROM employees WHERE ROWIDTOCHAR(ROWID) LIKE '%JAAB%' ORDER BY ROWID; ROWID ------------------ AAAFfIAAFAAAABSAAb
ROWIDTONCHAR
は、ROWID値をNVARCHAR2
データ型に変換します。この変換の結果は、常に、各国語キャラクタ・セットの文字で、18文字です。
次の例では、ROWID値をNVARCHAR2
文字列に変換します。
SELECT LENGTHB( ROWIDTONCHAR(ROWID) ) Length, ROWIDTONCHAR(ROWID) FROM employees ORDER BY length; LENGTH ROWIDTONCHAR(ROWID ---------- ------------------ 36 AAAL52AAFAAAABSABD 36 AAAL52AAFAAAABSABV . . .
RPAD
は、expr1
の右にexpr2
で指定した文字を必要に応じて連続的に埋め込み、長さn
にして戻します。このファンクションは、問合せの出力の書式設定に役立ちます。
expr1
およびexpr2
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。戻される文字列は、expr1
が文字データ型の場合はVARCHAR2
データ型、expr1
が各国語キャラクタ・データ型の場合はNVARCHAR2
データ型、expr1
がLOBデータ型の場合はLOBデータ型になります。expr1
と同じキャラクタ・セットの文字列が戻されます。引数n
は、NUMBER
型の整数か、またはNUMBER
型の整数に暗黙的に変換可能な値である必要があります。
expr1
はNULL以外である必要があります。expr2
を指定しない場合、デフォルトで空白1個が指定されます。expr1
がn
より長い場合、このファンクションはn
に収まるexpr1
の一部を戻します。
引数n
は、戻り値が画面に表示される場合の全体の長さです。多くのキャラクタ・セットでは、これは戻り値の文字数でもあります。ただし、マルチバイトのキャラクタ・セットでは、表示される文字列の長さが文字列の文字数と異なる場合もあります。
次の例では、空白にアスタリスクを埋め込んで、給与額の単純なチャートを作成します。
SELECT last_name, RPAD(' ', salary/1000/1, '*') "Salary" FROM employees WHERE department_id = 80 ORDER BY last_name, "Salary"; LAST_NAME Salary ------------------------- --------------- Abel ********** Ande ***** Banda ***** Bates ****** Bernstein ******** Bloom ********* Cambrault ********** Cambrault ****** Doran ****** Errazuriz *********** Fox ******** Greene ******** Hall ******** Hutton ******* Johnson ***** King ********* . . .
RTRIM
は、char
の右端から、set
に指定されたすべての文字を削除します。このファンクションは、問合せの出力の書式設定に役立ちます。
set
を指定しない場合、デフォルトで空白1個が指定されます。char
が文字リテラルの場合、一重引用符で囲む必要があります。RTRIM
はLTRIM
と同様の働きをします。
char
およびset
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。戻される文字列は、char
が文字データ型の場合はVARCHAR2
データ型、char
が各国語キャラクタデータ型の場合はNVARCHAR2
データ型、char
がLOBデータ型の場合はLOBデータ型になります。
次の例では、文字列の右端にあるすべてのピリオド、スラッシュおよび等号を文字列から削除します。
SELECT RTRIM('BROWNING: ./=./=./=./=./=.=','/=.') "RTRIM example" FROM DUAL; RTRIM exam ---------- BROWNING:
SCN_TO_TIMESTAMP
は、引数として、システム変更番号(SCN)と評価される数値を取り、そのSCNに関連付けられた概数のタイムスタンプを戻します。戻り値のデータ型はTIMESTAMP
です。このファンクションは、SCNに関連付けられたタイムスタンプを調べる場合に有効です。たとえば、このファンクションをORA_ROWSCN
疑似列とともに使用して、行への最新の変更にタイムスタンプを関連付けることができます。
次の例では、ORA_ROWSCN
疑似列を使用して行への最新の変更のシステム変更番号を判断し、SCN_TO_TIMESTAMP
を使用してそのSCNをタイムスタンプに変換します。
SELECT SCN_TO_TIMESTAMP(ORA_ROWSCN) FROM employees WHERE employee_id = 188;
このような問合せを使用して、Oracleフラッシュバック問合せで使用するためにシステム変更番号をタイムスタンプに変換することもできます。
SELECT salary FROM employees WHERE employee_id = 188; SALARY ---------- 3800 UPDATE employees SET salary = salary*10 WHERE employee_id = 188; COMMIT; SELECT salary FROM employees WHERE employee_id = 188; SALARY ---------- 38000 SELECT SCN_TO_TIMESTAMP(ORA_ROWSCN) FROM employees WHERE employee_id = 188; SCN_TO_TIMESTAMP(ORA_ROWSCN) --------------------------------------------------------------------------- 28-AUG-03 01.58.01.000000000 PM FLASHBACK TABLE employees TO TIMESTAMP TO_TIMESTAMP('28-AUG-03 01.00.00.000000000 PM'); SELECT salary FROM employees WHERE employee_id = 188; SALARY ---------- 3800
SESSIONTIMEZONE
は、現行のセッションのタイムゾーンを戻します。戻り型は、タイムゾーン・オフセット('[+|]TZH:TZM'
という書式の文字列型)またはタイムゾーン地域名です。これは、最近のALTER
SESSION
文でユーザーが指定したセッション・タイムゾーンの値によって異なります。
次の例では、現行のセッションのタイムゾーンを戻します。
SELECT SESSIONTIMEZONE FROM DUAL; SESSION ------- -08:00
SET
は、重複を排除することによってネストした表を単一の集合に変換します。このファンクションは、各要素が一意であるネストした表を戻します。戻されるネストした表のデータ型は、入力されたネストした表と同じです。
ネストした表の要素の型は、比較可能な型である必要があります。スカラー型以外の型の比較の可能性は、「比較条件」を参照してください。
次の例では、customers_demo
表から、ネストした表列cust_address_ntab
の一意の要素を選択します。
SELECT customer_id, SET(cust_address_ntab) address FROM customers_demo ORDER BY customer_id;
CUSTOMER_ID ADDRESS(STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID) ----------- ------------------------------------------------------------------------ 101 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('514 W Superior St', '46901', 'Kokomo', 'IN', 'US')) 102 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('2515 Bloyd Ave', '46218', 'Indianapolis', 'IN', 'US')) 103 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('8768 N State Rd 37', '47404', 'Bloomington', 'IN', 'US')) 104 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('6445 Bay Harbor Ln', '46254', 'Indianapolis', 'IN', 'US')) 105 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('4019 W 3Rd St', '47404', 'Bloomington', 'IN', 'US')) . . .
この例では、表customers_demo
と、データを含むネストした表の列が1つ必要です。この表およびネストした表の列を作成する方法については、「MULTISET演算子」を参照してください。
SIGN
は、n
の符号を戻します。このファンクションは、引数として、任意の数値データ型、または暗黙的にNUMBER
に変換可能な数値以外のデータ型を取り、NUMBER
を戻します。
NUMBER
型の値の場合、符号は次のとおりです。
浮動小数点数(BINARY_FLOAT
およびBINARY_DOUBLE
)の場合、このファンクションは数値の符号ビットを戻します。符号ビットは次のとおりです。
次の例では、ファンクションの引数(-15
)が0より小さいことを示します。
SELECT SIGN(-15) "Sign" FROM DUAL; Sign ---------- -1
SIN
は、n
(ラジアンで表された角度)のサインを戻します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。引数がBINARY_FLOAT
の場合、このファンクションはBINARY_DOUBLE
を戻します。それ以外の場合、引数と同じ数値データ型を戻します。
次の例では、30度のサインを戻します。
SELECT SIN(30 * 3.14159265359/180) "Sine of 30 degrees" FROM DUAL; Sine of 30 degrees ------------------ .5
SINH
は、n
の双曲線サインを戻します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。引数がBINARY_FLOAT
の場合、このファンクションはBINARY_DOUBLE
を戻します。それ以外の場合、引数と同じ数値データ型を戻します。
次の例では、1の双曲線サインを戻します。
SELECT SINH(1) "Hyperbolic sine of 1" FROM DUAL; Hyperbolic sine of 1 -------------------- 1.17520119
SOUNDEX
は、char
と同じ音声表現を持つ文字列を戻します。このファンクションによって、綴りが異なっても発音が類似した英単語を比較できます。
音声表現については、『The Art of Computer Programming, Volume 3: Sorting and Searching』(Donald E. Knuth著)で次のように定義されています。
b, f, p, v = 1 c, g, j, k, q, s, x, z = 2 d, t = 3 l = 4 m, n = 5 r = 6
char
は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
データ型です。戻り値は、char
と同じデータ型です。
このファンクションは、CLOB
データを直接的にサポートしていません。ただし、暗黙的なデータ変換を使用してCLOB
を引数として渡すことはできます。
次の例では、「Smyth」と同じ音声表現を持つ従業員を戻します。
SELECT last_name, first_name FROM hr.employees WHERE SOUNDEX(last_name) = SOUNDEX('SMYTHE') ORDER BY last_name, first_name; LAST_NAME FIRST_NAME ---------- ---------- Smith Lindsey Smith William
SQRT
は、n
の平方根を戻します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。また、引数の数値データ型と同じデータ型を戻します。
次の例では、26の平方根を戻します。
SELECT SQRT(26) "Square root" FROM DUAL; Square root ----------- 5.09901951
STATS_BINOMIAL_TEST
は、有効な値が2つのみである二値変数に使用する直接確立法です。このファンクションは、標本の割合と指定された割合との差をテストします。このテストでは通常、小さいサイズの標本が使用されます。
このファンクションは4つの引数を取ります。expr1
はテスト対象の標本、expr2
は割合を求める値、p
はテストの基準となる割合です。4つ目の引数はVARCHAR2
型の戻り値です。4つ目の引数を指定しない場合、デフォルトでTWO_SIDED_PROB
が戻り値になります。表5-3に、戻り値の意味を示します。
EXACT_PROB
では、pと一致する割合が戻される確率が戻されます。標本における割合が、50%と大幅に異なるか(有意差があるか)どうかをテストする場合、通常、p
を0.50に設定します。割合が異なるかどうかのみをテストする場合、戻り値にTWO_SIDED_PROB
を使用します。割合がexpr2
の値より大きいかどうかをテストする場合、戻り値にONE_SIDED_PROB_OR_MORE
を使用します。割合がexpr2
より小さいかどうかをテストする場合、戻り値にONE_SIDED_PROB_OR_LESS
を使用します。
次の例では、母集団の69%が男性であるという仮定に基づいて観測された男性数が、実際の男性数と正確に同一となる確率を判断します。
SELECT AVG(DECODE(cust_gender, 'M', 1, 0)) real_proportion, STATS_BINOMIAL_TEST (cust_gender, 'M', 0.68, 'EXACT_PROB') exact, STATS_BINOMIAL_TEST (cust_gender, 'M', 0.68, 'ONE_SIDED_PROB_OR_LESS') prob_or_less FROM sh.customers;
クロス集計は、2つの名義変数の分析に使用する方法です。STATS_CROSSTAB
ファンクションは、2つの式とVARCHAR2
型の戻り値の3つの引数を取ります。expr1
およびexpr2
は、分析対象の2つの変数です。このファンクションは、3つ目の引数に従って1つの数値を戻します。3つ目の引数を指定しない場合、デフォルトでCHISQ_SIG
が戻り値になります。表5-4に、戻り値の意味を示します。
戻り値 | 意味 |
---|---|
|
カイ2乗の観測値 |
|
カイ2乗の観測値の有意性 |
|
カイ2乗の自由度 |
|
ファイ係数 |
|
クラメールのV統計 |
|
一致係数 |
|
コーエンのカッパ |
次の例では、性別と収入水準の関連の強さを判断します。
SELECT STATS_CROSSTAB (cust_gender, cust_income_level, 'CHISQ_OBS') chi_squared, STATS_CROSSTAB (cust_gender, cust_income_level, 'CHISQ_SIG') p_value, STATS_CROSSTAB (cust_gender, cust_income_level, 'PHI_COEFFICIENT') phi_coefficient FROM sh.customers; CHI_SQUARED P_VALUE PHI_COEFFICIENT ----------- ---------- --------------- 251.690705 1.2364E-47 .067367056
STATS_F_TEST
は、2つの分散に有意差があるかどうかをテストします。fの観測値は、他方の分散に対する一方の分散の比率です。この値が1と大きく異なる場合は、通常、有意差があることを示しています。
このファンクションは3つの引数を取ります。expr1
はグループ変数または独立変数で、expr2
は値の標本です。このファンクションは、3つ目の引数に従って1つの数値を戻します。3つ目の引数を指定しない場合、デフォルトでTWO_SIDED_SIG
が戻り値になります。表5-5に、戻り値の意味を示します。
戻り値 | 意味 |
---|---|
|
fの観測値 |
|
分子の自由度 |
|
分母の自由度 |
|
fの片側有意 |
|
fの両側有意 |
片側有意は常に上側確率に関連します。最後の引数expr3
は、expr1で指定した2つのグループのうち、大きい値または分子(棄却域が上側確率の値)のグループを示します。
fの観測値は、2つ目のグループの分散に対する1つ目のグループの分散の比率です。fの観測値の有意性は、2つの分散が偶然に異なる確率で、0(ゼロ)〜1の数値です。この有意性の値が小さい場合、2つの分散に有意差があることを示しています。各分散の自由度は、標本における観測数から1を引いた値です。
次の例では、男性と女性のクレジット利用限度額に有意差があるかどうかを判断します。p_valueが0(ゼロ)に近くなく、f_statisticが1に近いという結果は、男性と女性のクレジット利用限度額の差が有意でないことを示しています。
SELECT VARIANCE(DECODE(cust_gender, 'M', cust_credit_limit, null)) var_men, VARIANCE(DECODE(cust_gender, 'F', cust_credit_limit, null)) var_women, STATS_F_TEST(cust_gender, cust_credit_limit, 'STATISTIC', 'F') f_statistic, STATS_F_TEST(cust_gender, cust_credit_limit) two_sided_p_value FROM sh.customers; VAR_MEN VAR_WOMEN F_STATISTIC TWO_SIDED_P_VALUE ---------- ---------- ----------- ----------------- 12879896.7 13046865 1.01296348 .311928071
STATS_KS_TEST
は、2つの標本を比較して、それらが同じ母集団に属しているか、または同じ分布を持つ母集団に属しているかをテストするKolmogorov-Smirnovファンクションです。このファンクションでは、標本の母集団が正規分布に従うとは仮定されません。
このファンクションは、2つの式とVARCHAR2
型の戻り値の3つの引数を取ります。expr1
には、データを2つのサンプルに分類する値を指定します。expr2
には、各サンプルの値を指定します。expr1
に、行を1つのみか3つ以上のサンプルに分類する値を指定すると、エラーが発生します。このファンクションは、3つ目の引数に従って1つの値を戻します。3つ目の引数を指定しない場合、デフォルトでSIG
が戻り値になります。表5-6に、戻り値の意味を示します。
戻り値 | 意味 |
---|---|
|
Dの観測値 |
|
Dの有意性 |
次の例では、Kolmogorov-Smirnov検定を使用して、男性と女性に対する売上の分布が偶然であるかどうかを判断します。
SELECT stats_ks_test(cust_gender, amount_sold, 'STATISTIC') ks_statistic, stats_ks_test(cust_gender, amount_sold) p_value FROM sh.customers c, sh.sales s WHERE c.cust_id = s.cust_id; KS_STATISTIC P_VALUE ------------ ---------- .003841396 .004080006
STATS_MODE
は、引数として値の集合を取り、最も出現頻度の高い値を戻します。複数の最頻値が存在する場合、Oracle Databaseは1つの最頻値を選択し、その値のみを戻します。
複数の最頻値(存在する場合)を取得する場合は、次の不確定な問合せに示すとおり、他のファンクションの組合せを使用する必要があります。
SELECT x FROM (SELECT x, COUNT(x) AS cnt1 FROM t GROUP BY x) WHERE cnt1 = (SELECT MAX(cnt2) FROM (SELECT COUNT(x) AS cnt2 FROM t GROUP BY x));
次の例では、hr.employees
表の部門ごとの給与の最頻値を戻します。
SELECT department_id, STATS_MODE(salary) FROM employees GROUP BY department_id ORDER BY department_id, stats_mode(salary); DEPARTMENT_ID STATS_MODE(SALARY) ------------- ------------------ 10 4400 20 6000 30 2500 40 6500 50 2500 60 4800 70 10000 80 9500 90 17000 100 6900 110 8300 7000
複数の最頻値が存在し、そのすべての最頻値を取得する必要がある場合は、次の例に示すとおり、他のファンクションの組合せを使用します。
SELECT commission_pct FROM (SELECT commission_pct, COUNT(commission_pct) AS cnt1 FROM employees GROUP BY commission_pct) WHERE cnt1 = (SELECT MAX (cnt2) FROM (SELECT COUNT(commission_pct) AS cnt2 FROM employees GROUP BY commission_pct)) ORDER BY commission_pct; COMMISSION_PCT -------------- .2 .3
Mann-Whitney検定では、2つの独立した標本を比較して、2つの母集団が同じ分布ファンクションを持つという帰無仮説を、2つの分布ファンクションは異なるという対立仮説に対してテストします。
STATS_MW_TEST
では、STATS_T_TEST_
*ファンクションとは異なり、標本間の差が正規分布するとは仮定されません。このファンクションは、3つの引数とVARCHAR2
型の戻り値を取ります。expr1
には、データをグループに分類する値を指定します。expr2
には、各グループの値を指定します。このファンクションは、3つ目の引数に従って1つの値を戻します。3つ目の引数を指定しない場合、デフォルトでTWO_SIDED_SIG
が戻り値になります。表7-7に、戻り値の意味を示します。
ZまたはUの観測値の有意性は、2つの分散が偶然に異なる確率で、0(ゼロ)〜1の数値です。この有意性の値が小さい場合、2つの分散に有意差があることを示しています。各分散の自由度は、標本における観測数から1を引いた値です。
戻り値 | 意味 |
---|---|
|
Zの観測値 |
|
Uの観測値 |
|
Zの片側有意 |
|
Zの両側有意 |
片側有意は常に上側確率に関連します。最後の引数expr3
は、expr1で指定した2つのグループのうち、大きい値(棄却域が上側確率の値)のグループを示します。
STATS_MW_TEST
は、値の順位の合計における差を確認して、標本が同じ分布からのものである確率を計算します。標本が同じ分布に属している場合、各標本の合計値は近くなります。
次の例では、Mann-Whitney検定を使用して、男性と女性に対する売上の分布が偶然であるかどうかを判断します。
SELECT STATS_MW_TEST (cust_gender, amount_sold, 'STATISTIC') z_statistic, STATS_MW_TEST (cust_gender, amount_sold, 'ONE_SIDED_SIG', 'F') one_sided_p_value FROM sh.customers c, sh.sales s WHERE c.cust_id = s.cust_id; Z_STATISTIC ONE_SIDED_P_VALUE ----------- ----------------- -1.4011509 .080584471
STATS_ONE_WAY_ANOVA
ファンクションによる一元配置分散分析では、分散の2つの異なる推定値を比較して、(複数のグループまたは変数の)平均値の差をテストして統計学的有意差を求めます。1つ目の推定値は、各グループまたはカテゴリ内の分散に基づきます。これは、群内平均平方または平均平方誤差と呼ばれます。2つ目の推定値は、グループの平均値の分散に基づきます。これは、群間平均平方と呼ばれます。グループの平均値に有意差がある場合、その群間平均平方は期待値より大きくなり、群内平均平方に一致しません。グループの平均平方が一貫している場合、2つの分散の推定値はほぼ同じになります。
STATS_ONE_WAY_ANOVA
は、2つの式とVARCHAR2
型の戻り値の3つの引数を取ります。expr1
には、データをグループの集合に分割する独立変数またはグループ変数を指定します。expr2
には、グループの各構成要素に対応する値を含む従属変数(数式)を指定します。このファンクションは、3つ目の引数に従って1つの数値を戻します。3つ目の引数を指定しない場合、デフォルトでSIG
が戻り値になります。表5-8に、戻り値の意味を示します。
一元配置分散分析の有意性は群間平均平方と群内平均平方の比率に対するf検定の片側有意を求めることによって判断されます。f検定では片側有意を使用する必要があります。これは、群間平均平方は、群内平均平方以上のみになるためです。そのため、STATS_ONE_WAY_ANOVA
が戻す有意性は、グループ間の差が偶然である確率で、0(ゼロ)〜1の数値です。この数値が小さいほど、グループ間の有意差が大きくなります。f検定の実行の詳細は、「STATS_F_TEST」を参照してください。
次の例では、収入水準内での売上平均の差と、収入水準間での売上平均の差の有意性を判断します。p_valuesが0(ゼロ)に近いという結果は、男性と女性の両方に対して、様々な収入水準の人々に販売された商品の金額には有意差があることを示しています。
SELECT cust_gender, STATS_ONE_WAY_ANOVA(cust_income_level, amount_sold, 'F_RATIO') f_ratio, STATS_ONE_WAY_ANOVA(cust_income_level, amount_sold, 'SIG') p_value FROM sh.customers c, sh.sales s WHERE c.cust_id = s.cust_id GROUP BY cust_gender ORDER BY cust_gender; C F_RATIO P_VALUE - ---------- ---------- F 5.59536943 4.7840E-09 M 9.2865001 6.7139E-17
t検定ファンクションを次に示します。
STATS_T_TEST_ONE
: 1標本t検定
STATS_T_TEST_PAIRED
: 対応のある2標本t検定(クロスt検定とも呼ばれる)
STATS_T_TEST_INDEP
: 同じ分散(併合分散)を持つ独立した2つのグループのt検定
STATS_T_TEST_INDEPU
: 異なる分散(非併合分散)を持つ独立した2つのグループのt検定
t検定では、平均値の差の有意性を測定します。この検定を使用して、2つのグループの平均値の比較、または1つのグループの平均値と定数の比較を行えます。1標本および2標本STATS_T_TEST_
*ファンクションは、2つの式とVARCHAR2
型の戻り値の3つの引数を取ります。このファンクションは、3つ目の引数に従って1つの数値を戻します。3つ目の引数を指定しない場合、デフォルトでTWO_SIDED_SIG
が戻り値になります。表5-9に、戻り値の意味を示します。
戻り値 | 意味 |
---|---|
|
tの観測値 |
|
自由度 |
|
tの片側有意 |
|
tの両側有意 |
2つの独立したSTATS_T_TEST_
*ファンクションは、3つ目の引数がSTATISTIC
またはONE_SIDED_SIG
として指定されている場合、4つ目の引数(expr3
)を取ることができます。この場合、expr3
は、expr1
のどちらの値が大きい値(棄却域が上側確率の値)であるかを示します。
tの観測値の有意性は、tの値が偶然得られた確率で、0(ゼロ)〜1の数値です。この値が小さいほど、平均値間の有意差が大きくなります。片側有意は常に上側確率に関連します。1標本および対応のあるt-testの場合、最初の式が大きい値になります。独立したt-testの場合、expr3
で指定した値が大きい値になります。
自由度は、tの観測値を求めるために使用したt検定の種類によって異なります。たとえば、1標本t検定(STATS_T_TEST_ONE
)の場合、自由度は標本における観測数から1を引いた値です。
STATS_T_TEST_ONE
ファンクションでは、expr1
には標本を指定し、expr2
には標本平均値の比較対象となる定数平均値を指定します。このt-testの場合にのみ、expr2
はオプションとなります。定数平均値は、デフォルトで0になります。このファンクションは、標本平均値と既知の平均値の差を、平均値の標準誤差で割ってt値を求めます(STATS_T_TEST_PAIRED
では、平均値の差の標準誤差で割ります)。
次の例では、平均表示価格と定数値60の差の有意性を判断します。
SELECT AVG(prod_list_price) group_mean, STATS_T_TEST_ONE(prod_list_price, 60, 'STATISTIC') t_observed, STATS_T_TEST_ONE(prod_list_price, 60) two_sided_p_value FROM sh.products; GROUP_MEAN T_OBSERVED TWO_SIDED_P_VALUE ---------- ---------- ----------------- 139.545556 2.32107746 .023158537
STATS_T_TEST_PAIRED
ファンクションでは、expr1
およびexpr2
には、比較する平均値の計算元の2つの標本をそれぞれ指定します。このファンクションは、標本平均値の差を、平均値の差の標準誤差で割ってt値を求めます(STATS_T_TEST_ONE
では、平均値の標準誤差で割ります)。
STATS_T_TEST_INDEP
およびSTATS_T_TEST_INDEPU
ファンクションでは、expr1
はグループ列で、expr2
は値の標本です。併合分散用のファンクション(STATS_T_TEST_INDEP
)は、同様の分散を持つ2つの分布において、平均値が同じか異なるかをテストします。非併合分散用のファンクション(STATS_T_TEST_INDEPU
)は、既知の有意差のある分散を持つ2つの分布においても、平均値が同じか異なるかをテストします。
これらのファンクションを使用する前に、標本の分散に有意差があるかどうかを判断しておくことをお薦めします。有意差がある場合、そのデータは異なる形状の分布に属している可能性があり、平均値の差が有効でない場合があります。f検定を実行して、分散の差を判断できます。分散に有意差がない場合、STATS_T_TEST_INDEP
を使用します。有意差がある場合は、STATS_T_TEST_INDEPU
を使用します。f検定の実行の詳細は、「STATS_F_TEST」を参照してください。
次の例では、各分布の分散が同様である(併合分散)として、男性と女性に対する平均売上間の差の有意性を判断します。
SELECT SUBSTR(cust_income_level, 1, 22) income_level, AVG(DECODE(cust_gender, 'M', amount_sold, null)) sold_to_men, AVG(DECODE(cust_gender, 'F', amount_sold, null)) sold_to_women, STATS_T_TEST_INDEP(cust_gender, amount_sold, 'STATISTIC', 'F') t_observed, STATS_T_TEST_INDEP(cust_gender, amount_sold) two_sided_p_value FROM sh.customers c, sh.sales s WHERE c.cust_id = s.cust_id GROUP BY ROLLUP(cust_income_level) ORDER BY income_level, sold_to_men, sold_to_women, t_observed; INCOME_LEVEL SOLD_TO_MEN SOLD_TO_WOMEN T_OBSERVED TWO_SIDED_P_VALUE ---------------------- ----------- ------------- ---------- ----------------- A: Below 30,000 105.28349 99.4281447 -1.9880629 .046811482 B: 30,000 - 49,999 102.59651 109.829642 3.04330875 .002341053 C: 50,000 - 69,999 105.627588 110.127931 2.36148671 .018204221 D: 70,000 - 89,999 106.630299 110.47287 2.28496443 .022316997 E: 90,000 - 109,999 103.396741 101.610416 -1.2544577 .209677823 F: 110,000 - 129,999 106.76476 105.981312 -.60444998 .545545304 G: 130,000 - 149,999 108.877532 107.31377 -.85298245 .393671218 H: 150,000 - 169,999 110.987258 107.152191 -1.9062363 .056622983 I: 170,000 - 189,999 102.808238 107.43556 2.18477851 .028908566 J: 190,000 - 249,999 108.040564 115.343356 2.58313425 .009794516 K: 250,000 - 299,999 112.377993 108.196097 -1.4107871 .158316973 L: 300,000 and above 120.970235 112.216342 -2.0642868 .039003862 107.121845 113.80441 .686144393 .492670059 106.663769 107.276386 1.08013499 .280082357 14 rows selected.
次の例では、各分布の分散に既知の有意差がある(非併合分散)として、男性と女性に対する平均売上間の差の有意性を判断します。
SELECT SUBSTR(cust_income_level, 1, 22) income_level, AVG(DECODE(cust_gender, 'M', amount_sold, null)) sold_to_men, AVG(DECODE(cust_gender, 'F', amount_sold, null)) sold_to_women, STATS_T_TEST_INDEPU(cust_gender, amount_sold, 'STATISTIC', 'F') t_observed, STATS_T_TEST_INDEPU(cust_gender, amount_sold) two_sided_p_value FROM sh.customers c, sh.sales s WHERE c.cust_id = s.cust_id GROUP BY ROLLUP(cust_income_level) ORDER BY income_level, sold_to_men, sold_to_women, t_observed; INCOME_LEVEL SOLD_TO_MEN SOLD_TO_WOMEN T_OBSERVED TWO_SIDED_P_VALUE ---------------------- ----------- ------------- ---------- ----------------- A: Below 30,000 105.28349 99.4281447 -2.0542592 .039964704 B: 30,000 - 49,999 102.59651 109.829642 2.96922332 .002987742 C: 50,000 - 69,999 105.627588 110.127931 2.3496854 .018792277 D: 70,000 - 89,999 106.630299 110.47287 2.26839281 .023307831 E: 90,000 - 109,999 103.396741 101.610416 -1.2603509 .207545662 F: 110,000 - 129,999 106.76476 105.981312 -.60580011 .544648553 G: 130,000 - 149,999 108.877532 107.31377 -.85219781 .394107755 H: 150,000 - 169,999 110.987258 107.152191 -1.9451486 .051762624 I: 170,000 - 189,999 102.808238 107.43556 2.14966921 .031587875 J: 190,000 - 249,999 108.040564 115.343356 2.54749867 .010854966 K: 250,000 - 299,999 112.377993 108.196097 -1.4115514 .158091676 L: 300,000 and above 120.970235 112.216342 -2.0726194 .038225611 107.121845 113.80441 .689462437 .490595765 106.663769 107.276386 1.07853782 .280794207 14 rows selected.
STATS_WSR_TEST
は、対応のある標本のウィルコクソンの符号順位検定であり、標本間の差の中央値と0(ゼロ)に有意差があるかどうかを判断します。差の絶対値は、標本を順序付けし、順位に符号を付けて求められます。また、帰無仮説によって、正の差の順位の合計が、負の差の順位の合計に等しいと仮定されます。
このファンクションは3つの引数を取ります。expr1
およびexpr2
は分析対象の2つの標本で、3つ目の引数はVARCHAR2
型の戻り値です。3つ目の引数を指定しない場合、デフォルトでTWO_SIDED_SIG
が戻り値になります。表5-10に、戻り値の意味を示します。
戻り値 | 意味 |
---|---|
|
Zの観測値 |
|
Zの片側有意 |
|
Zの両側有意 |
片側有意は常に上側確率に関連します。expr1
が大きい値(棄却域が上側確率の値)になります。
STDDEV
は、数値の集合であるexpr
の標本標準偏差を戻します。これは、集計ファンクションまたは分析ファンクションとして使用できます。このファンクションは、STDDEV_SAMP
がNULLを戻すことに対して、入力データが1行のみの場合にSTDDEV
が0(ゼロ)を戻すという点で、STDDEV_SAMP
と異なります。
Oracle Databaseは、VARIANCE
集計ファンクションに対して定義された分散の平方根として標準偏差を計算します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。また、引数の数値データ型と同じデータ型を戻します。
DISTINCT
を指定する場合は、analytic_clause
のquery_partition_clause
のみ指定できます。order_by_clause
およびwindowing_clause
は指定できません。
次の例では、サンプル表hr.employees
の給与値の標本標準偏差を戻します。
SELECT STDDEV(salary) "Deviation" FROM employees; Deviation ---------- 3909.36575
次の例では、hire_date
で順序付けられたサンプル表hr.employees
の部門80の給与の値の累積標準偏差を戻します。
SELECT last_name, salary, STDDEV(salary) OVER (ORDER BY hire_date) "StdDev" FROM employees WHERE department_id = 30 ORDER BY last_name, salary, "StdDev"; LAST_NAME SALARY StdDev ------------------------- ---------- ---------- Baida 2900 4035.26125 Colmenares 2500 3362.58829 Himuro 2600 3649.2465 Khoo 3100 5586.14357 Raphaely 11000 0 Tobias 2800 4650.0896
STDDEV_POP
は母集団標準偏差を計算し、母集団分散の平方根を戻します。これは、集計ファンクションまたは分析ファンクションとして使用できます。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。また、引数の数値データ型と同じデータ型を戻します。
このファンクションは、VAR_POP
ファンクションの平方根と同じです。VAR_POP
がNULLを戻す場合、このファンクションもNULLを戻します。
次の例では、サンプル表sh.sales
にある売上高の母集団標準偏差および標本標準偏差を戻します。
SELECT STDDEV_POP(amount_sold) "Pop", STDDEV_SAMP(amount_sold) "Samp" FROM sales; Pop Samp ---------- ---------- 896.355151 896.355592
次の例では、サンプル表hr.employees
の部門ごとの給与の母集団標準偏差を戻します。
SELECT department_id, last_name, salary, STDDEV_POP(salary) OVER (PARTITION BY department_id) AS pop_std FROM employees ORDER BY department_id, last_name, salary, pop_std; DEPARTMENT_ID LAST_NAME SALARY POP_STD ------------- ------------------------- ---------- ---------- 10 Whalen 4400 0 20 Fay 6000 3500 20 Hartstein 13000 3500 30 Baida 2900 3069.6091 . . . 100 Urman 7800 1644.18166 110 Gietz 8300 1850 110 Higgins 12000 1850 Grant 7000 0
STDDEV_SAMP
は標本累積標準偏差を計算し、標本分散の平方根を戻します。これは、集計ファンクションまたは分析ファンクションとして使用できます。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。また、引数の数値データ型と同じデータ型を戻します。
このファンクションは、VAR_SAMP
ファンクションの平方根と同じです。VAR_SAMP
がNULLを戻す場合、このファンクションもNULLを戻します。
「STDDEV_POP」の集計の例を参照してください。
次の例では、employees
表の部門ごとの給与の標本標準偏差を戻します。
SELECT department_id, last_name, hire_date, salary, STDDEV_SAMP(salary) OVER (PARTITION BY department_id ORDER BY hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum_sdev FROM employees ORDER BY department_id, last_name, hire_date, salary, cum_sdev; DEPARTMENT_ID LAST_NAME HIRE_DATE SALARY CUM_SDEV ------------- --------------- --------- ---------- ---------- 10 Whalen 17-SEP-87 4400 20 Fay 17-AUG-97 6000 4949.74747 20 Hartstein 17-FEB-96 13000 30 Baida 24-DEC-97 2900 4035.26125 30 Colmenares 10-AUG-99 2500 3362.58829 30 Himuro 15-NOV-98 2600 3649.2465 30 Khoo 18-MAY-95 3100 5586.14357 30 Raphaely 07-DEC-94 11000 . . . 100 Greenberg 17-AUG-94 12000 2121.32034 100 Popp 07-DEC-99 6900 1801.11077 100 Sciarra 30-SEP-97 7700 1925.91969 100 Urman 07-MAR-98 7800 1785.49713 110 Gietz 07-JUN-94 8300 2616.29509 110 Higgins 07-JUN-94 12000 Grant 24-MAY-99 7000
SUBSTR
の各ファンクションは、char
のposition
の文字からsubstring_length
文字分の文字列を抜き出して戻します。SUBSTR
は、入力キャラクタ・セットによって定義された文字を使用して、長さを計算します。SUBSTRB
は、文字のかわりにバイトを使用します。SUBSTRC
は、完全なUnicodeキャラクタを使用します。SUBSTR2
は、UCS2コードポイントを使用します。SUBSTR4
は、UCS4コードポイントを使用します。
position
が0の場合、1として処理されます。
position
が正の場合、Oracle Databaseはchar
の始めから数えて最初の文字を検索します。
position
が負の場合、Oracleはchar
の終わりから逆方向に数えます。
substring_length
を指定しないと、Oracleはchar
の終わりまでのすべての文字を戻します。substring_length
が1より小さい場合、NULLを戻します。
char
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。position
およびsubstring_length
は、NUMBER
データ型か、または暗黙的にNUMBER
に変換可能な任意のデータ型で、整数である必要があります。戻り値は、char
と同じデータ型です。引数としてSUBSTR
に渡された浮動小数点数は、自動的に整数に変換されます。
次の例では、「ABCDEFG」の指定されたサブストリングを戻します。
SELECT SUBSTR('ABCDEFG',3,4) "Substring" FROM DUAL; Substring --------- CDEF SELECT SUBSTR('ABCDEFG',-5,4) "Substring" FROM DUAL; Substring --------- CDEF
データベース・キャラクタ・セットがダブルバイトの場合を想定します。
SELECT SUBSTRB('ABCDEFG',5,4.2) "Substring with bytes" FROM DUAL; Substring with bytes -------------------- CD
SUM
は、expr
の値の合計を戻します。これは、集計ファンクションまたは分析ファンクションとして使用できます。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。また、引数の数値データ型と同じデータ型を戻します。
DISTINCT
を指定する場合は、analytic_clause
のquery_partition_clause
のみ指定できます。order_by_clause
およびwindowing_clause
は指定できません。
次の例では、サンプル表hr.employees
にあるすべての給与の合計を計算します。
SELECT SUM(salary) "Total" FROM employees; Total ---------- 691400
次の例では、サンプル表hr.employees
の各マネージャについて、そのマネージャの下で働く従業員の現在の給与以下の給与の累積合計を計算します。RaphaelyおよびCambraultが同じ累積を持っています。これは、RaphaelyおよびCambraultが同じ給与であるため、Oracle Databaseが給与の値を同時に追加し、同じ累積合計を両方の行に対して適用したためです。
SELECT manager_id, last_name, salary, SUM(salary) OVER (PARTITION BY manager_id ORDER BY salary RANGE UNBOUNDED PRECEDING) l_csum FROM employees ORDER BY manager_id, last_name, salary, l_csum; MANAGER_ID LAST_NAME SALARY L_CSUM ---------- --------------- ---------- ---------- MANAGER_ID LAST_NAME SALARY L_CSUM ---------- ------------------------- ---------- ---------- 100 Cambrault 11000 68900 100 De Haan 17000 155400 100 Errazuriz 12000 80900 100 Fripp 8200 36400 100 Hartstein 13000 93900 100 Kaufling 7900 20200 100 Kochhar 17000 155400 100 Mourgos 5800 5800 100 Partners 13500 107400 100 Raphaely 11000 68900 100 Russell 14000 121400 . . . 149 Hutton 8800 39000 149 Johnson 6200 6200 149 Livingston 8400 21600 149 Taylor 8600 30200 201 Fay 6000 6000 205 Gietz 8300 8300 King 24000 24000
SYS_CONNECT_BY_PATH
は、階層問合せのみで有効です。このファンクションは、ルートからノードへの列の値のパスを、CONNECT
BY
条件によって戻された各行をchar
で区切った列の値とともに戻します。
column
およびchar
は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
データ型です。戻される文字列は、VARCHAR2
データ型であり、column
と同じキャラクタ・セットです。
次の例では、従業員Kochhar
からKochhar
のすべての従業員(およびそれらの従業員の従業員)への従業員名のパスを戻します。
SELECT LPAD(' ', 2*level-1)||SYS_CONNECT_BY_PATH(last_name, '/') "Path" FROM employees START WITH last_name = 'Kochhar' CONNECT BY PRIOR employee_id = manager_id; Path ------------------------------ /Kochhar/Greenberg/Chen /Kochhar/Greenberg/Faviet /Kochhar/Greenberg/Popp /Kochhar/Greenberg/Sciarra /Kochhar/Greenberg/Urman /Kochhar/Higgins/Gietz /Kochhar/Baer /Kochhar/Greenberg /Kochhar/Higgins /Kochhar/Mavris /Kochhar/Whalen /Kochhar
SYS_CONTEXT
は、コンテキストnamespace
に関連付けられたparameter
の値を戻します。このファンクションは、SQL文およびPL/SQL文で使用できます。
namespace
およびparameter
には、文字列、またはネームスペースまたは属性を指定する文字列に変換する式を指定できます。コンテキストnamespace
はすでに作成されている必要があり、関連付けられたparameter
およびその値は、DBMS_SESSION
.set_context
プロシージャを使用して設定されている必要があります。namespace
は有効なSQL識別子である必要があります。parameter
名には、すべての文字列を指定できます。大/小文字を区別しますが、長さは30バイト以下です。
戻り値のデータ型はVARCHAR2
です。戻り値のデフォルトの最大サイズは、256バイトです。オプションのlength
パラメータを指定して、このデフォルトを上書きできます。このパラメータは、NUMBER
か、または暗黙的にNUMBER
に変換可能な値である必要があります。値の有効範囲は1〜4000バイトです。無効な値を指定すると、Oracle Databaseはその値を無視してデフォルト値を使用します。
Oracleでは、現行のセッションを記述するUSERENV
という組込みネームスペースを提供しています。ネームスペースUSERENV
の事前定義パラメータについては、表5-11を参照してください。
参照:
|
次の例では、データベースにログインしたユーザー名を戻します。
CONNECT OE/password SELECT SYS_CONTEXT ('USERENV', 'SESSION_USER') FROM DUAL; SYS_CONTEXT ('USERENV', 'SESSION_USER') ------------------------------------------------------ OE
次の例では、hr_apps
の作成時に、コンテキストhr_apps
に関連付けられたPL/SQLパッケージの属性group_no
に対する値として設定されたグループ番号を戻します。
SELECT SYS_CONTEXT ('hr_apps', 'group_no') "User Group" FROM DUAL;
表5-12に、非推奨になったネームスペースUSERENV
のパラメータを示します。これらのパラメータはどれも指定しないでください。かわりに、「コメント」列で提案する代替手段を使用します。
SYS_DBURIGen
は、引数として1つ以上の列または属性、およびオプションでROWIDを取り、特定の列または行オブジェクトへのDBUriType
データ型のURLを生成します。これによって、データベースからXML文書を検索するためのURLを使用できるようになります。
参照されるすべての列または属性は、サンプル表に存在する必要があります。これらは、主キーの役割を果たす必要があります。実際に表の主キーに一致する必要はありませんが、一意の値を参照する必要があります。複数の列を指定すると、最後の列以外のすべての列はデータベースの行を識別し、指定された最後の列は行にある列を識別します。
デフォルトでは、URLはフォーマットされたXML文書を指します。ドキュメントのテキストのみを指す場合は、オプションの'text()
'を指定します
列または属性を含む表またはビューが、問合せのコンテキストで指定されるスキーマを持たない場合、Oracle Databaseは、表名またはビュー名をパブリック・シノニムとして解析します。
次の例では、SYS_DBURIGen
ファンクションを使用して、サンプル表hr.employees
のemployee_id
= 206である行のemail
列へのDBUriType
データ型のURLを生成します。
SELECT SYS_DBURIGEN(employee_id, email) FROM employees WHERE employee_id = 206; SYS_DBURIGEN(EMPLOYEE_ID,EMAIL)(URL, SPARE) -------------------------------------------------------------------- DBURITYPE('/PUBLIC/EMPLOYEES/ROW[EMPLOYEE_ID=''206'']/EMAIL', NULL)
SYS_EXTRACT_UTC
は、タイムゾーン・オフセットまたはタイムゾーン地域名を含む日時値から協定世界時(UTC)(以前のグリニッジ標準時)を抽出します。
次の例では、指定された日時からUTCを抽出します。
SELECT SYS_EXTRACT_UTC(TIMESTAMP '2000-03-28 11:30:00.00 -08:00') FROM DUAL; SYS_EXTRACT_UTC(TIMESTAMP'2000-03-2811:30:00.00-08:00') ----------------------------------------------------------------- 28-MAR-00 07.30.00 PM
SYS_GUID
は、16バイトで構成されたグローバルな一意の識別子(RAW
値)を生成して戻します。多くのプラットフォームでは、生成された識別子は、ホスト識別子、プロセス、またはファンクションをコールするプロセスやスレッドのスレッド識別子、およびそのプロセスやスレッドに対する非反復値(バイトの順序)で構成されています。
次の例では、サンプル表hr.locations
に列を追加後、一意の識別子を各行に挿入し、グローバルな一意識別子の16バイトのRAW
値を32文字の16進表記で戻します。
ALTER TABLE locations ADD (uid_col RAW(32)); UPDATE locations SET uid_col = SYS_GUID(); SELECT location_id, uid_col FROM locations ORDER BY location_id, uid_col; LOCATION_ID UID_COL ----------- ---------------------------------------------------------------- 1000 09F686761827CF8AE040578CB20B7491 1100 09F686761828CF8AE040578CB20B7491 1200 09F686761829CF8AE040578CB20B7491 1300 09F68676182ACF8AE040578CB20B7491 1400 09F68676182BCF8AE040578CB20B7491 1500 09F68676182CCF8AE040578CB20B7491 . . .
SYS_TYPEID
は、オペランドで最も指定される型の型IDを戻します。この値は、主に、置換可能な列の基礎となる型判別式の列を識別するために使用されます。たとえば、型判別式の列に索引を構築するために、SYS_TYPEID
によって戻される値を使用できます。
このファンクションは、オブジェクト型のオペランドのみで使用してください。すべての最終ルート・オブジェクト型(型階層に属さない最終型)は、NULL型のIDを持ちます。Oracle Databaseは、型階層に属するすべての型に、NULL以外の一意の型IDを割り当てます。
次の例では、「置換可能な表および列のサンプル:」で作成された表persons
およびbooks
を使用します。最初の問合せは、persons
表に格納されたオブジェクト・インスタンスの最も指定される型を戻します。
SELECT name, SYS_TYPEID(VALUE(p)) "Type_id" FROM persons p; NAME Type_id ------------------------- -------------------------------- Bob 01 Joe 02 Tim 03
次の問合せは、books
表に格納された作者の最も指定される型を戻します。
SELECT b.title, b.author.name, SYS_TYPEID(author) "Type_ID" FROM books b; TITLE AUTHOR.NAME Type_ID ------------------------- -------------------- ------------------- An Autobiography Bob 01 Business Rules Joe 02 Mixing School and Work Tim 03
SYS_TYPEID
ファンクションを使用すると、表の型判別式の列に索引を作成できます。「置換可能な列の索引の作成例:」を参照してください。
SYS_XMLAGG
は、expr
によって表されるすべてのXML文書またはXMLフラグメントを集約し、単一のXML文書を生成します。このファンクションは、デフォルト名ROWSET
の新しい囲み要素を追加します。XML文書を別の方法でフォーマットする場合は、XMLFormat
オブジェクトのインスタンスであるfmt
を指定します。
次の例では、SYS_XMLGEN
ファンクションを使用して、従業員名の最初の文字がRであるサンプル表employees
の各行に対して、XML文書を生成した後、デフォルトの囲み要素ROWSET
の1つのXML文書にすべての行を集約します。
SELECT SYS_XMLAGG(SYS_XMLGEN(last_name)) XMLAGG FROM employees WHERE last_name LIKE 'R%' ORDER BY xmlagg; XMLAGG -------------------------------------------------------------------------------- <?xml version="1.0"?> <ROWSET> <LAST_NAME>Rajs</LAST_NAME> <LAST_NAME>Raphaely</LAST_NAME> <LAST_NAME>Rogers</LAST_NAME> <LAST_NAME>Russell</LAST_NAME> </ROWSET>
SYS_XMLGEN
は、データベースの特定の行および列を評価する式を取り、XML文書を含むXMLType
型のインスタンスを戻します。expr
は、スカラー値、ユーザー定義型またはXMLType
インスタンスです。
expr
がスカラー値である場合、ファンクションはスカラー値を含むXML要素を戻します。
expr
が型である場合、ファンクションはXML要素へユーザー定義型の属性をマップします。
expr
がXMLType
インスタンスである場合、ファンクションはデフォルトのタグ名がROW
であるXML要素でドキュメントを囲みます。
デフォルトでは、XML文書の要素はexpr
の要素と一致します。たとえば、expr
が列名に変換される場合、XMLの囲み要素は同じ列名になります。XML文書を別の方法でフォーマットする場合は、XMLFormat
オブジェクトのインスタンスであるfmt
を指定します。
参照:
|
次の例では、サンプル表oe.employees
からemployee_id
値が205の従業員の電子メールIDを検出し、EMAIL
要素を持つXML文書を含むXMLType
のインスタンスを生成します。
SELECT SYS_XMLGEN(email) FROM employees WHERE employee_id = 205; SYS_XMLGEN(EMAIL) ------------------------------------------------------------------- <?xml version="1.0"?> <EMAIL>SHIGGINS</EMAIL>
SYSDATE
は、データベースが存在するオペレーティング・システムの現在の日付と時刻のセットを戻します。戻り値のデータ型はDATE
です。戻り値の書式は、NLS_DATE_FORMAT
初期化パラメータの値によって異なります。このファンクションに引数は不要です。分散SQL文では、このファンクションはローカル・データベースのオペレーティング・システムの日付と時刻のセットを戻します。CHECK
制約の条件でこのファンクションは使用できません。
次の例では、オペレーティング・システムの現在の日付および時刻を戻します。
SELECT TO_CHAR (SYSDATE, 'MM-DD-YYYY HH24:MI:SS') "NOW" FROM DUAL; NOW ------------------- 04-13-2001 09:45:51
SYSTIMESTAMP
は、データベースが存在するシステムの、秒の小数部とタイムゾーンを含む日付を戻します。戻り型は、TIMESTAMP
WITH
TIME
ZONE
です。
次の例では、システムのタイムスタンプを戻します。
SELECT SYSTIMESTAMP FROM DUAL; SYSTIMESTAMP ------------------------------------------------------------------ 28-MAR-00 12.38.55.538741 PM -08:00
次の例では、秒の小数部を明示的に指定する方法を示します。
SELECT TO_CHAR(SYSTIMESTAMP, 'SSSSS.FF') FROM DUAL; TO_CHAR(SYSTIME --------------- 55615.449255
TAN
は、n
(ラジアンで表された角度)のタンジェントを戻します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。引数がBINARY_FLOAT
の場合、このファンクションはBINARY_DOUBLE
を戻します。それ以外の場合、引数と同じ数値データ型を戻します。
次の例では、135度のタンジェントを戻します。
SELECT TAN(135 * 3.14159265359/180) "Tangent of 135 degrees" FROM DUAL; Tangent of 135 degrees ---------------------- - 1
TANH
は、n
の双曲線タンジェントを戻します。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。引数がBINARY_FLOAT
の場合、このファンクションはBINARY_DOUBLE
を戻します。それ以外の場合、引数と同じ数値データ型を戻します。
次の例では、5の双曲線タンジェントを戻します。
SELECT TANH(.5) "Hyperbolic tangent of .5" FROM DUAL; Hyperbolic tangent of .5 ------------------------ .462117157
TIMESTAMP_TO_SCN
は、引数としてタイムスタンプ値を取り、そのタイムスタンプに関連付けられたシステム変更番号(SCN)の概数を戻します。戻り値のデータ型はNUMBER
です。このファンクションは、特定のタイムスタンプに関連付けられたSCNを調べる場合に有効です。
次の例では、行をoe.orders
表に挿入し、TIMESTAMP_TO_SCN
を使用して、挿入操作のシステム変更番号を判断します。(実際に戻されるSCNは、システムごとに異なります。)
INSERT INTO orders (order_id, order_date, customer_id, order_total) VALUES (5000, SYSTIMESTAMP, 188, 2345); 1 row created. COMMIT; Commit complete. SELECT TIMESTAMP_TO_SCN(order_date) FROM orders WHERE order_id = 5000; TIMESTAMP_TO_SCN(ORDER_DATE) ---------------------------- 574100
TO_BINARY_DOUBLE
は、倍精度の浮動小数点数を戻します。
expr
には、文字列か、またはNUMBER
、BINARY_FLOAT
またはBINARY_DOUBLE
型の数値を指定できます。expr
がBINARY_DOUBLE
の場合、このファンクションはexpr
を戻します。
fmt
'引数および'nlsparam
'引数はexpr
が文字列の場合にのみ有効です。これらの引数は、TO_CHAR
(数値)ファンクションの場合と同じ用途に使用されます。
expr
文字列には、浮動小数点数の書式要素(F
、f
、D
またはd
)は使用できません。
文字列またはNUMBER
からBINARY_DOUBLE
への変換は、正確に行われない場合があります。これは、NUMBER
および文字列型では単精度、BINARY_DOUBLE
で倍精度を使用して数値を表現するためです。
BINARY_FLOAT
からBINARY_DOUBLE
への変換は正確に行われます。
次の例では、それぞれ異なる数値データ型の3つの列を持つ次の表を使用します。
CREATE TABLE float_point_demo (dec_num NUMBER(10,2), bin_double BINARY_DOUBLE, bin_float BINARY_FLOAT); INSERT INTO float_point_demo VALUES (1234.56,1234.56,1234.56); SELECT * FROM float_point_demo; DEC_NUM BIN_DOUBLE BIN_FLOAT ---------- ---------- ---------- 1234.56 1.235E+003 1.235E+003
次の例では、NUMBER
データ型の値をBINARY_DOUBLE
データ型の値に変換します。
SELECT dec_num, TO_BINARY_DOUBLE(dec_num) FROM float_point_demo; DEC_NUM TO_BINARY_DOUBLE(DEC_NUM) ---------- ------------------------- 1234.56 1.235E+003
次の例では、dec_num
列およびbin_double
列から抽出されたダンプ情報を比較します。
SELECT DUMP(dec_num) "Decimal", DUMP(bin_double) "Double" FROM float_point_demo; Decimal Double --------------------------- --------------------------------------------- Typ=2 Len=4: 194,13,35,57 Typ=101 Len=8: 192,147,74,61,112,163,215,10
TO_BINARY_FLOAT
は、単精度の浮動小数点数を戻します。
expr
には、文字列か、またはNUMBER
、BINARY_FLOAT
またはBINARY_DOUBLE
型の数値を指定できます。expr
がBINARY_FLOAT
の場合、このファンクションはexpr
を戻します。
fmt
'引数および'nlsparam
'引数はexpr
が文字列の場合にのみ有効です。これらの引数は、TO_CHAR
(数値)ファンクションの場合と同じ用途に使用されます。
expr
文字列には、浮動小数点数の書式要素(F
、f
、D
またはd
)は使用できません。
文字列またはNUMBER
からBINARY_FLOAT
への変換は、正確に行われない場合があります。これは、NUMBER
および文字列型では単精度、BINARY_FLOAT
では倍精度を使用して数値を表現するためです。
BINARY_DOUBLE
値に、BINARY_FLOAT
がサポートする数を超える精度ビットが使用されている場合、BINARY_DOUBLE
からBINARY_FLOAT
への変換は正確に行われません。
次の例では、「TO_BINARY_DOUBLE」で作成したfloat_point_demo
表を使用して、NUMBER
データ型の値をBINARY_FLOAT
データ型の値に変換します。
SELECT dec_num, TO_BINARY_FLOAT(dec_num) FROM float_point_demo; DEC_NUM TO_BINARY_FLOAT(DEC_NUM) ---------- ------------------------ 1234.56 1.235E+003
TO_BLOB
は、LONG
RAW
およびRAW
値をBLOB
値に変換します。
次の例は、RAW
列の値としてBLOB
を戻します。
SELECT TO_BLOB(raw_column) blob FROM raw_table; BLOB ----------------------- 00AADD343CDBBD
TO_CHAR
(文字)は、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データをデータベース・キャラクタ・セットに変換します。戻り値は常にVARCHAR2
です。
このファンクションを使用してキャラクタLOBをデータベース・キャラクタ・セットに変換すると、変換するLOB値がターゲットの型よりも大きい場合、エラーが戻されます。
このファンクションは任意のXMLファンクションと組み合せて使用できますが、生成される日付の書式は、XMLスキーマの標準書式ではなく、データベースの書式になります。
参照:
|
次の例では、単純な文字列を文字データとして解析します。
SELECT TO_CHAR('01110') FROM DUAL; TO_CH ----- 01110
この例と、「TO_CHAR(数値)」の最初の例を比較してください。
次の例では、pm.print_media
表のCLOB
データをデータベース・キャラクタ・セットに変換します。
SELECT TO_CHAR(ad_sourcetext) FROM print_media WHERE product_id = 2268; TO_CHAR(AD_SOURCETEXT) -------------------------------------------------------------------- ****************************** TIGER2 2268...Standard Hayes Compatible Modem Product ID: 2268 The #1 selling modem in the universe! Tiger2's modem includes call management and Internet voicing. Make real-time full duplex phone calls at the same time you're online. **********************************
TO_CHAR
(日時)は、DATE
、TIMESTAMP
、TIMESTAMP
WITH
TIME
ZONE
またはTIMESTAMP
WITH
LOCAL
TIME
ZONE
データ型の日時値または期間値を日付書式fmt
で指定された書式のVARCHAR2
データ型に変換します。fmt
を省略すると、次のように、date
はVARCHAR2
値に変換されます。
DATE
値は、デフォルトの日付書式の値に変換されます。
TIMESTAMP
およびTIMESTAMP
WITH
LOCAL
TIME
ZONE
値は、デフォルトのタイムスタンプ書式の値に変換されます。
TIMESTAMP
WITH
TIME
ZONE
値は、タイムゾーン書式のデフォルトのタイムスタンプの値に変換されます。
日時書式の詳細は、「書式モデル」を参照してください。
'nlsparam'
引数には、月と日の名前および略称が戻される言語を指定します。この引数は、次の書式で指定します。
'NLS_DATE_LANGUAGE = language'
'nlsparam'
を指定しないと、このファンクションはセッションのデフォルト日付言語を使用します。
次の例で使用する表は、次のとおりです。
CREATE TABLE date_tab ( ts_col TIMESTAMP, tsltz_col TIMESTAMP WITH LOCAL TIME ZONE, tstz_col TIMESTAMP WITH TIME ZONE);
次の例では、TO_CHAR
を別のTIMESTAMP
データ型に適用した結果を示します。TIMESTAMP
WITH
LOCAL
TIME
ZONE
列の結果は、セッションのタイムゾーンを識別します。これに対して、TIMESTAMP
およびTIMESTAMP
WITH
TIME
ZONE
列の結果は、セッションのタイムゾーンを識別しません。
ALTER SESSION SET TIME_ZONE = '-8:00'; INSERT INTO date_tab VALUES ( TIMESTAMP'1999-12-01 10:00:00', TIMESTAMP'1999-12-01 10:00:00', TIMESTAMP'1999-12-01 10:00:00'); INSERT INTO date_tab VALUES ( TIMESTAMP'1999-12-02 10:00:00 -8:00', TIMESTAMP'1999-12-02 10:00:00 -8:00', TIMESTAMP'1999-12-02 10:00:00 -8:00'); SELECT TO_CHAR(ts_col, 'DD-MON-YYYY HH24:MI:SSxFF') AS ts_date, TO_CHAR(tstz_col, 'DD-MON-YYYY HH24:MI:SSxFF TZH:TZM') AS tstz_date FROM date_tab ORDER BY ts_date, tstz_date; TS_DATE TSTZ_DATE ------------------------------ ------------------------------------- 01-DEC-1999 10:00:00.000000 01-DEC-1999 10:00:00.000000 -08:00 02-DEC-1999 10:00:00.000000 02-DEC-1999 10:00:00.000000 -08:00 SELECT SESSIONTIMEZONE, TO_CHAR(tsltz_col, 'DD-MON-YYYY HH24:MI:SSxFF') AS tsltz FROM date_tab ORDER BY sessiontimezone, tsltz; SESSIONTIM TSLTZ ---------- ------------------------------ -08:00 01-DEC-1999 10:00:00.000000 -08:00 02-DEC-1999 10:00:00.000000 ALTER SESSION SET TIME_ZONE = '-5:00'; SELECT TO_CHAR(ts_col, 'DD-MON-YYYY HH24:MI:SSxFF') AS ts_col, TO_CHAR(tstz_col, 'DD-MON-YYYY HH24:MI:SSxFF TZH:TZM') AS tstz_col FROM date_tab ORDER BY ts_col, tstz_col; TS_COL TSTZ_COL ------------------------------ ------------------------------------- 01-DEC-1999 10:00:00.000000 01-DEC-1999 10:00:00.000000 -08:00 02-DEC-1999 10:00:00.000000 02-DEC-1999 10:00:00.000000 -08:00 SELECT SESSIONTIMEZONE, TO_CHAR(tsltz_col, 'DD-MON-YYYY HH24:MI:SSxFF') AS tsltz_col FROM date_tab ORDER BY sessiontimezone, tsltz_col; 2 3 4 SESSIONTIM TSLTZ_COL ---------- ------------------------------ -05:00 01-DEC-1999 13:00:00.000000 -05:00 02-DEC-1999 13:00:00.000000
TO_CHAR
(数値)は、n
を、オプションの数値書式fmt
を使用してVARCHAR2
データ型の値に変換します。n
値には、NUMBER
、BINARY_FLOAT
またはBINARY_DOUBLE
型の値を指定できます。fmt
を指定しないと、n
の有効桁数を保持するために十分な長さのVARCHAR2
値に変換されます。
n
が負の場合、書式が適用された後で符号が適用されます。したがって、TO_CHAR(-1, '$9')
は、$-1ではなく-$1を戻します。
日時書式の詳細は、「書式モデル」を参照してください。
'nlsparam'
引数には、数値書式要素によって戻される次の文字を指定します。
この引数は、次の書式で指定します。
'NLS_NUMERIC_CHARACTERS = ''dg'' NLS_CURRENCY = ''text'' NLS_ISO_CURRENCY = territory '
文字d
およびg
は、それぞれ小数点文字および桁区切りを表します。これらは、異なるシングルバイト文字である必要があります。引用符付き文字列の中では、パラメータ値を囲む一重引用符を2つ使用する必要があります。通貨記号には10文字使用できます。
'nlsparam'
またはパラメータのいずれか1つを省略すると、このファンクションはセッションのデフォルト・パラメータ値を使用します。
次の文は、暗黙的な変換を使用して、文字列と数値を数値に結合します。
SELECT TO_CHAR('01110' + 1) FROM dual; TO_C ---- 1111
この例と、「TO_CHAR(文字)」の最初の例を比較してください。
次の例では、出力で通貨記号の左側に空白埋めが行われます。
SELECT TO_CHAR(-10000,'L99G999D99MI') "Amount" FROM DUAL; Amount -------------- $10,000.00- SELECT TO_CHAR(-10000,'L99G999D99MI', 'NLS_NUMERIC_CHARACTERS = '',.'' NLS_CURRENCY = ''AusDollars'' ') "Amount" FROM DUAL; Amount ------------------- AusDollars10.000,00-
オプションの数値書式fmt
では、L
は各国通貨記号を、MI
は後に付くマイナス記号(-)を表します。すべての数値書式要素のリストは、表2-17「FX書式モデル修飾子による文字データと書式モデルの一致」を参照してください。
TO_CLOB
は、LOB列またはその他の文字列のNCLOB
値をCLOB
値に変換します。char
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。Oracle Databaseは、基礎となるLOBデータを各国語キャラクタ・セットからデータベース・キャラクタ・セットに変換することによって、このファンクションを実行します。
次の文は、サンプル表pm.print_media
のNCLOB
データをCLOB
に変換し、CLOB
列に挿入します。
UPDATE PRINT_MEDIA SET AD_FINALTEXT = TO_CLOB (AD_FLTEXTN);
TO_DATE
は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
データ型のchar
を、DATE
データ型の値に変換します。
注意: このファンクションは、データを別の日時データ型へは変換しません。他の日時変換の詳細は、「TO_TIMESTAMP」、「TO_TIMESTAMP_TZ」、「TO_DSINTERVAL」および「TO_YMINTERVAL」を参照してください。 |
fmt
は、char
の書式を指定する日時書式モデルです。fmt
を指定しない場合、char
はデフォルトの日付書式である必要があります。デフォルトの日付書式は、NLS_TERRITORY
初期化パラメータによって暗黙的に決まります。NLS_DATE_FORMAT
パラメータによって明示的に設定することもできます。fmt
がJ
(ユリウス日)の場合、char
は整数である必要があります。
'nlsparam'
引数は、日付変換のTO_CHAR
ファンクションの場合と同じ用途で使用されます。
引数char
にDATE
値を持つTO_DATE
ファンクションは使用しないでください。戻されるDATE
値は、fmt
またはデフォルトの日付書式によって、元のchar
とは異なる世紀の値を持つことがあります。
このファンクションは、CLOB
データを直接的にサポートしていません。ただし、暗黙的なデータ変換を使用してCLOB
を引数として渡すことはできます。
次の例では、文字列をタイムスタンプに変換します。
SELECT TO_DATE( 'January 15, 1989, 11:00 A.M.', 'Month dd, YYYY, HH:MI A.M.', 'NLS_DATE_LANGUAGE = American') FROM DUAL; TO_DATE(' --------- 15-JAN-89
戻された値は、NLS_TERRITORY
パラメータが'AMERICA
'に設定されている場合は、デフォルトの日付書式を反映します。異なるNLS_TERRITORY
の値が設定されている場合は、異なるデフォルトの日付書式となります。
ALTER SESSION SET NLS_TERRITORY = 'KOREAN'; SELECT TO_DATE( 'January 15, 1989, 11:00 A.M.', 'Month dd, YYYY, HH:MI A.M.', 'NLS_DATE_LANGUAGE = American') FROM DUAL; TO_DATE( -------- 89/01/15
TO_DSINTERVAL
は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
データ型の文字列を、INTERVAL
DAY
TO
SECOND
型に変換します。
TO_DSINTERVAL
は、2つの書式のいずれかの引数を取ります。
SQL書式では、days
は0(ゼロ)〜999999999の整数、hours
は0(ゼロ)〜23の整数、minutes
とseconds
は0(ゼロ)〜59の整数になります。frac_secs
は秒の小数部であり、.0〜.999999999になります。日付と時間は1つ以上の空白で区切ります。これ以外に、書式要素の間にも空白を使用できます。
ISO書式では、days
、hours
、minutes
およびseconds
は、0(ゼロ)〜999999999の整数になります。frac_secs
は秒の小数部であり、.0〜.999999999になります。値に空白は使用できません。
次の例では、1990年1月1日から100日以上勤務している従業員をhr.employees
表から検索します。
SELECT employee_id, last_name FROM employees WHERE hire_date + TO_DSINTERVAL('100 00:00:00') <= DATE '1990-01-01' ORDER BY employee_id; EMPLOYEE_ID LAST_NAME ----------- --------------- 100 King 101 Kochhar 200 Whalen
TO_LOB
は、long_column
列のLONG
またはLONG RAW
値をLOB値に変換します。このファンクションはLONG
またはLONG
RAW
列に対してのみ、およびINSERT
文における副問合せのSELECT構文のリストにおいてのみ適用できます。
このファンクションを使用する前に、LOB列を作成して変換されたLONG
値を受け取る必要があります。LONG
値を変換する場合は、CLOB
列を作成します。LONG
RAW値を変換する場合は、BLOB
列を作成します。
索引構成表を作成する場合は、CREATE
TABLE
... AS
SELECT
文の副問合せで、TO_LOB
ファンクションを使用してLONG
列をLOB列に変換することはできません。LONG
列を含まない索引構成表を作成し、INSERT
...AS
SELECT
文でTO_LOB
ファンクションを使用してください。
参照:
|
次の例では、不確定な表old_table
のLONG
データに対するTO_LOB
ファンクションの使用方法を示します。
CREATE TABLE new_table (col1, col2, ... lob_col CLOB); INSERT INTO new_table (select o.col1, o.col2, ... TO_LOB(o.old_long_col) FROM old_table o;
TO_MULTI_BYTE
は、シングルバイト文字を、対応するマルチバイト文字に変換してchar
を戻します。char
のデータ型は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
です。戻り値は、char
と同じデータ型です。
char
内に同等のマルチバイト文字がないシングルバイト文字は、シングルバイト文字として出力されます。このファンクションは、ご使用のデータベース・キャラクタ・セットに、シングルバイト文字およびマルチバイト文字の両方が含まれている場合にのみ有効です。
このファンクションは、CLOB
データを直接的にサポートしていません。ただし、暗黙的なデータ変換を使用してCLOB
を引数として渡すことはできます。
次の例では、シングルバイトA
からUTF8のマルチバイトA
への変換を示します。
SELECT dump(TO_MULTI_BYTE( 'A')) FROM DUAL; DUMP(TO_MULTI_BYTE('A')) ------------------------ Typ=1 Len=3: 239,188,161
TO_NCHAR
(文字)は、文字列、CHAR
、VARCHAR2
、CLOB
またはNCLOB
値を各国語キャラクタ・セットに変換します。戻り値は常にNVARCHAR2
です。このファンクションは、各国語キャラクタ・セットでUSING
句を指定したTRANSLATE
... USING
ファンクションと同じです。
次の例では、oe.customers
表のVARCHAR2
データを各国語キャラクタ・セットに変換します。
SELECT TO_NCHAR(cust_last_name) FROM customers WHERE customer_id=103; TO_NCHAR(CUST_LAST_NAME) -------------------------------------------------- Taylor
TO_NCHAR
(日時)は、DATE
、TIMESTAMP
、TIMESTAMP
WITH
TIME
ZONE
、TIMESTAMP
WITH
LOCAL
TIME
ZONE
、INTERVAL
MONTH
TO
YEAR
またはINTERVAL
DAY
TO
SECOND
データ型の文字列をデータベース・キャラクタ・セットから各国語キャラクタ・セットに変換します。
次の例では、状態が9
であるすべての注文のorder_date
を各国語キャラクタ・セットに変換します。
SELECT TO_NCHAR(ORDER_DATE) AS order_date FROM ORDERS WHERE ORDER_STATUS > 9 ORDER BY order_date; ORDER_DATE -------------------------------------------------------------------------- 06-DEC-99 02.22.34.225609 PM 13-SEP-99 10.19.00.654279 AM 14-SEP-99 09.53.40.223345 AM 26-JUN-00 10.19.43.190089 PM 27-JUN-00 09.53.32.335522 PM
TO_NCHAR
(数値)は、n
を各国語キャラクタ・セットの文字列に変換します。n
値には、NUMBER
、BINARY_FLOAT
またはBINARY_DOUBLE
型の値を指定できます。このファンクションは、引数と同じ型の値を戻します。オプションのfmt
、n
に対応する'nlsparam'
は、DATE
、TIMESTAMP
、TIMESTAMP
WITH
TIME
ZONE
、TIMESTAMP
WITH
LOCAL
TIME
ZONE
、INTERVAL
MONTH
TO
YEAR
またはINTERVAL
DAY
TO
SECOND
データ型です。
次の例では、oe.orders
サンプル表のcustomer_id
値を各国語キャラクタ・セットに変換します。
SELECT TO_NCHAR(customer_id) "NCHAR_Customer_ID" FROM orders WHERE order_status > 9 ORDER BY "NCHAR_Customer_ID"; NCHAR_Customer_ID ---------------------------------------- 102 103 148 148 149
TO_NCLOB
は、LOB列またはその他の文字列のCLOB
値をNCLOB
値に変換します。char
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。Oracle Databaseは、char
のキャラクタ・セットをデータベース・キャラクタ・セットから各国語キャラクタ・セットに変換することによって、このファンクションを実行します。
次の例では、TO_NCLOB
ファンクションでデータを変換後、pm.print_media
表のNCLOB
列に文字データを挿入します。
INSERT INTO print_media (product_id, ad_id, ad_fltextn) VALUES (3502, 31001, TO_NCLOB('Placeholder for new product description'));
TO_NUMBER
は、expr
を、NUMBER
データ型の値に変換します。expr
には、BINARY_DOUBLE
値、またはオプションの書式モデルfmt
によって指定された書式の数値を含むCHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
データ型の値を指定できます。
BINARY_FLOAT
のexpr
を指定できます。ただし、浮動小数点はその内部表示によってのみ解釈されるため、この指定は意味がありません。
このファンクションは、CLOB
データを直接的にサポートしていません。ただし、暗黙的なデータ変換を使用してCLOB
を引数として渡すことはできます。
次の例では、文字列データを数値に変換します。
UPDATE employees SET salary = salary + TO_NUMBER('100.00', '9G999D99') WHERE last_name = 'Perkins';
このファンクションの'nlsparam'
引数は、数値変換のTO_CHAR
ファンクションの場合と同じ用途に使用されます。詳細は、「TO_CHAR(数値)」を参照してください。
SELECT TO_NUMBER('-AusDollars100','L9G999D99', ' NLS_NUMERIC_CHARACTERS = '',.'' NLS_CURRENCY = ''AusDollars'' ') "Amount" FROM DUAL; Amount ---------- -100
TO_SINGLE_BYTE
は、マルチバイト文字を、対応するシングルバイト文字に変換してchar
を戻します。char
のデータ型は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
です。戻り値は、char
と同じデータ型です。
char
内に同等のシングルバイト文字がないマルチバイト文字は、マルチバイト文字として出力されます。このファンクションは、ご使用のデータベース・キャラクタ・セットに、シングルバイト文字およびマルチバイト文字の両方が含まれている場合にのみ有効です。
このファンクションは、CLOB
データを直接的にサポートしていません。ただし、暗黙的なデータ変換を使用してCLOB
を引数として渡すことはできます。
次の例では、UTF8のマルチバイトA
からシングルバイトのASCIIのA
への変換を示します。
SELECT TO_SINGLE_BYTE( CHR(15711393)) FROM DUAL; T - A
TO_TIMESTAMP
は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
データ型のchar
を、TIMESTAMP
データ型の値に変換します。
オプションのfmt
は、char
の書式を指定します。fmt
を指定しない場合、char
はデフォルト書式のTIMESTAMP
データ型である必要があります。このデータ型は、NLS_TIMESTAMP_FORMAT
初期化パラメータによって決まります。オプションの'nlsparam'
引数は、日付変換のTO_CHAR
ファンクションの場合と同じ用途で使用されます。
このファンクションは、CLOB
データを直接的にサポートしていません。ただし、暗黙的なデータ変換を使用してCLOB
を引数として渡すことはできます。
次の例では、文字列をタイムスタンプに変換します。文字列がデフォルトのTIMESTAMP
書式ではないため、書式マスクを指定する必要があります。
SELECT TO_TIMESTAMP ('10-Sep-02 14:10:10.123000', 'DD-Mon-RR HH24:MI:SS.FF') FROM DUAL; TO_TIMESTAMP('10-SEP-0214:10:10.123000','DD-MON-RRHH24:MI:SS.FF') --------------------------------------------------------------------------- 10-SEP-02 02.10.10.123000000 PM
参照:
デフォルトの |
TO_TIMESTAMP_TZ
は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
データ型のchar
を、TIMESTAMP
WITH
TIME
ZONE
データ型の値に変換します。
オプションのfmt
は、char
の書式を指定します。fmt
を指定しない場合、char
はデフォルト書式のTIMESTAMP
WITH
TIME
ZONE
データ型である必要があります。オプションの'nlsparam'
は、日付変換のTO_CHAR
ファンクションの場合と同じ用途で使用されます。
次の例では、文字列をTIMESTAMP
WITH
TIME
ZONE
値に変換します。
SELECT TO_TIMESTAMP_TZ('1999-12-01 11:00:00 -8:00', 'YYYY-MM-DD HH:MI:SS TZH:TZM') FROM DUAL; TO_TIMESTAMP_TZ('1999-12-0111:00:00-08:00','YYYY-MM-DDHH:MI:SSTZH:TZM') -------------------------------------------------------------------- 01-DEC-99 11.00.00.000000000 AM -08:00
次の例では、サンプル表oe.order_items
およびoe.orders
を使用して、UNION
演算のNULL列をTIMESTAMP
WITH
LOCAL
TIME
ZONE
としてキャストします。
SELECT order_id, line_item_id, CAST(NULL AS TIMESTAMP WITH LOCAL TIME ZONE) order_date FROM order_items UNION SELECT order_id, to_number(null), order_date FROM orders; ORDER_ID LINE_ITEM_ID ORDER_DATE ---------- ------------ ----------------------------------- 2354 1 2354 2 2354 3 2354 4 2354 5 2354 6 2354 7 2354 8 2354 9 2354 10 2354 11 2354 12 2354 13 2354 14-JUL-00 05.18.23.234567 PM 2355 1 2355 2 ...
TO_YMINTERVAL
は、CHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
データ型の文字列を、INTERVAL
YEAR
TO
MONTH
型に変換します。
TO_YMINTERVAL
は、2つの書式のいずれかの引数を取ります。
SQL書式では、years
は0(ゼロ)〜999999999の整数、months
は0(ゼロ)〜11の整数になります。これ以外に、書式要素の間に空白を使用できます。
ISO書式では、yearsとmonthsは、0(ゼロ)〜999999999の整数になります。Days、hours
、minutes
、seconds
およびfrac_secsは、負でない整数になります。負の整数を指定した場合は、無視されます。値に空白は使用できません。
次の例では、サンプル表hr.employees
の各従業員の雇用された後から1年と2か月後の日付を計算します。
SELECT hire_date, hire_date + TO_YMINTERVAL('01-02') "14 months" FROM employees; HIRE_DATE 14 months --------- --------- 17-JUN-87 17-AUG-88 21-SEP-89 21-NOV-90 13-JAN-93 13-MAR-94 03-JAN-90 03-MAR-91 21-MAY-91 21-JUL-92 . . .
TRANSLATE
は、from_string
内のすべての文字をto_string
内の対応する文字に置換してexpr
を戻します。from_string
内に存在しないexpr
内の文字は置換されません。引数from_string
には、to_string
より多い文字を指定できます。この場合、from_string
の終わりにある余分な文字には、to_string
内に対応する文字がありません。これらの余分な文字がexpr
内にある場合、それらの文字は戻り値から削除されます。
from_string
内に1つの文字が複数回現れた場合は、最初の出現に対応するto_string
マッピングが使用されます。
戻り値からfrom_string
内のすべての文字を削除するために、to_string
に空の文字列を使用することはできません。Oracle Databaseは空の文字列をNULLと解析するため、このファンクションにNULLの引数がある場合、NULLが戻されます。from_string
内の文字をすべて削除するには、from_string
の先頭に別の文字を結合し、この文字をto_string
として指定します。たとえば、TRANSLATE
( expr
, 'x0123456789
', 'x
')では、すべての数字がexpr
から削除されます。
TRANSLATE
は、REPLACE
ファンクションに関連する機能を提供します。REPLACE
ファンクションでは、単一の文字列から別の単一の文字列への置換、および文字列の削除を実行できます。TRANSLATE
では、1回の操作で複数の単一文字を1対1で置き換えることができます。
このファンクションは、CLOB
データを直接的にサポートしていません。ただし、暗黙的なデータ変換を使用してCLOB
を引数として渡すことはできます。
次の文は、本のタイトルを、ファイル名などに使用するために文字列に変換します。from_string
には、空白、アスタリスク、スラッシュおよびアポストロフィの4つの文字(およびエスケープ文字のアポストロフィ)が含まれています。to_string
には、3つのアンダースコアのみが含まれています。from_string
の4つ目の文字に対応する置換文字がないため、戻り値ではアポストロフィが削除されています。
SELECT TRANSLATE('SQL*Plus User''s Guide', ' */''', '___') FROM DUAL; TRANSLATE('SQL*PLUSU -------------------- SQL_Plus_Users_Guide
TRANSLATE
... USING
は、char
をデータベース・キャラクタ・セットと各国語キャラクタ・セット間の変換に指定されたキャラクタ・セットに変換します。
引数char
は変換する式です。
USING
CHAR_CS
引数を指定すると、char
がデータベース・キャラクタ・セットに変換されます。出力データ型はVARCHAR2
です。
USING
NCHAR_CS
引数を指定すると、char
が各国語キャラクタ・セットに変換されます。出力データ型はNVARCHAR2
です。
このファンクションは、OracleのCONVERT
ファンクションに似ていますが、入力または出力のデータ型にNCHAR
またはNVARCHAR2
を使用する場合は、CONVERT
ではなくこのファンクションを使用する必要があります。入力にUCS2コードポイントまたはバックスラッシュ(\)が含まれる場合は、UNISTR
ファンクションを使用してください。
次の文は、サンプル表oe.product_descriptions
のデータを使用して、TRANSLATE
... USING
ファンクションの使用方法を示しています。
CREATE TABLE translate_tab (char_col VARCHAR2(100), nchar_col NVARCHAR2(50)); INSERT INTO translate_tab SELECT NULL, translated_name FROM product_descriptions WHERE product_id = 3501; SELECT * FROM translate_tab; CHAR_COL NCHAR_COL -------------------- -------------------------------------------------- . . . C pre SPNIX4.0 - Sys C pro SPNIX4.0 - Sys C til SPNIX4.0 - Sys C voor SPNIX4.0 - Sys . . . UPDATE translate_tab SET char_col = TRANSLATE (nchar_col USING CHAR_CS); SELECT * FROM translate_tab; CHAR_COL NCHAR_COL ------------------------- ------------------------- . . . C per a SPNIX4.0 - Sys C per a SPNIX4.0 - Sys C pro SPNIX4.0 - Sys C pro SPNIX4.0 - Sys C for SPNIX4.0 - Sys C for SPNIX4.0 - Sys C til SPNIX4.0 - Sys C til SPNIX4.0 - Sys . . .
TREAT
は式の宣言型を変更します。
このファンクションを使用する場合は、type
に対するEXECUTE
オブジェクト権限が必要です。
type
は、スーパータイプまたはexpr
の宣言型のサブタイプである必要があります。expr
の最も指定される型がtype
(またはtype
のサブタイプ)である場合、TREAT
はexpr
を戻します。expr
の最も指定される型がtype
(またはtype
のサブタイプ)ではない場合、TREAT
はNULL
を戻します。
expr
の宣言型がREF
型の場合にのみ、REF
を指定できます。
expr
の宣言型がexpr
のソース型へのREF
である場合、type
はサブタイプまたはexpr
のソース型のスーパータイプである必要があります。DEREF
(expr
)の最も指定される型がtype
(またはtype
のサブタイプ)である場合、TREAT
はexpr
を戻します。DEREF
(expr
)の最も指定される型がtype
(またはtype
のサブタイプ)ではない場合、TREAT
はNULL
を戻します。
このファンクションは、CLOB
データを直接的にサポートしていません。ただし、暗黙的なデータ変換を使用してCLOB
を引数として渡すことはできます。
次の例では、「置換可能な表および列のサンプル:」で作成された表oe.persons
を使用します。次の例では、persons
表のすべての人物の給与属性を検索します。従業員ではない人物のインスタンスの値はNULLです。
SELECT name, TREAT(VALUE(p) AS employee_t).salary salary FROM persons p; NAME SALARY ------------------------- ---------- Bob Joe 100000 Tim 1000
TREAT
ファンクションを使用すると、置換可能列のサブタイプ属性に索引を作成できます。「置換可能な列の索引の作成例:」を参照してください。
TRIM
によって、文字列の先行または後続文字(またはその両方)を切り捨てることができます。trim_character
またはtrim_source
が文字リテラルの場合、一重引用符で囲む必要があります。
LEADING
を指定すると、Oracle Databaseはtrim_character
と等しい先行文字を削除します。
TRAILING
を指定すると、Oracleはtrim_character
と等しい後続文字を削除します。
BOTH
を指定するか、またはいずれも指定しない場合、Oracleはtrim_character
と等しい先行および後続文字を削除します。
trim_character
を指定しないと、デフォルト値は空白になります。
trim_source
のみを指定すると、Oracleは先行および後続空白を削除します。
VARCHAR2
データ型で戻します。値の最大長は、trim_source
の長さです。
trim_source
またはtrim_character
のいずれかがNULLの場合、TRIM
はNULLを戻します。
trim_character
とtrim_source
は両方とも、VARCHAR2
またはVARCHAR2
に暗黙的に変換できる任意のデータ型です。戻される文字列は、trim_source
が文字データ型の場合はVARCHAR2
データ型になり、trim_source
がLOBデータ型の場合はLOBになります。trim_source
と同じキャラクタ・セットの文字列が戻されます。
次の例では、hr
スキーマの従業員の雇用日から先行0(ゼロ)を切り捨てます。
SELECT employee_id, TO_CHAR(TRIM(LEADING 0 FROM hire_date)) FROM employees WHERE department_id = 60 ORDER BY employee_id; EMPLOYEE_ID TO_CHAR(T ----------- --------- 103 3-JAN-90 104 21-MAY-91 105 25-JUN-97 106 5-FEB-98 107 7-FEB-99
TRUNC
(数値)ファンクションは、n1
を小数第n2
位までに切り捨てた値を戻します。n2
を指定しない場合、n1
の小数点以下を切り捨てます。n2
が負の場合は、小数点の左n2
桁を切り捨てて、0(ゼロ)にします。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。n2
を指定しない場合、このファンクションは、引数の数値データ型と同じデータ型を戻します。n2
を指定すると、このファンクションはNUMBER
を戻します。
次の例では、数値を切り捨てます。
SELECT TRUNC(15.79,1) "Truncate" FROM DUAL; Truncate ---------- 15.7 SELECT TRUNC(15.79,-1) "Truncate" FROM DUAL; Truncate ---------- 10
TRUNC
(日付)ファンクションは、時刻部分を書式モデルfmt
で指定された単位まで切り捨てたdate
を戻します。このファンクションは、NLS_CALENDAR
セッション・パラメータの影響を受けません。このファンクションはグレゴリオ暦の規則に従って動作します。戻される値は、date
に異なる日時データ型を指定した場合でも、常にDATE
データ型です。fmt
を省略すると、date
は最も近い日に切り捨てられます。fmt
で使用できる書式モデルについては、「ROUNDおよびTRUNC日付ファンクション」を参照してください。
次の例では、日付を切り捨てます。
SELECT TRUNC(TO_DATE('27-OCT-92','DD-MON-YY'), 'YEAR') "New Year" FROM DUAL; New Year --------- 01-JAN-92
TZ_OFFSET
は、文が実行された日付に基づいた引数に対応するタイムゾーン・オフセットを戻します。有効なタイムゾーン名、UTCからのタイムゾーン・オフセット(それ自体を戻します)、またはキーワードSESSIONTIMEZONE
またはDBTIMEZONE
を入力できます。time_zone_name
の有効な値を表示するには、V$TIMEZONE_NAMES
動的パフォーマンス・ビューのTZNAME
列を問い合せます。
次の例では、UTCからUS/東部タイムゾーンのタイムゾーン・オフセットを戻します。
SELECT TZ_OFFSET('US/Eastern') FROM DUAL; TZ_OFFS ------- -04:00
UID
は、セッション・ユーザー(ログインしているユーザー)を一意に識別する整数を戻します。
次の例では、現行のユーザーのUIDを戻します。
SELECT UID FROM DUAL;
UNISTR
は、引数としてテキスト・リテラルまたは文字データに変換する式を取り、各国語キャラクタ・セットで戻します。データベースの各国語キャラクタ・セットは、AL16UTF16またはUTF8です。UNISTR
では、文字列への文字のUnicodeエンコーディング値の指定を可能にすることによって、Unicode文字列リテラルがサポートされます。これは、NCHAR
列にデータを挿入する場合などに有効です。
Unicodeエンコーディング値は、\xxxxという形式です。xxxxは、文字のUCS-2エンコーディング形式での16進数値です。付加される文字は2つのコード単位としてエンコードされます。1つ目は高サロゲート範囲(U+D800〜U+DBFF)からエンコードされ、2つ目は低サロゲート範囲(U+DC00〜U+DFFF)からエンコードされます。バックスラッシュ自体を文字列に含めるには、バックスラッシュをもう1つ追加します(\\)。
移植性およびデータ保護のために、UNISTR
文字列の引数にはASCII文字およびUnicodeエンコーディング値のみを指定することをお薦めします。
次の例では、ASCII文字およびUnicodeエンコーディング値をUNISTR
ファンクションに渡した後、そのUNISTRファンクションによって各国語キャラクタ・セットで文字列が戻されます。
SELECT UNISTR('abc\00e5\00f1\00f6') FROM DUAL; UNISTR ------ abcåñö
UPDATEXML
は、引数としてXMLType
インスタンスおよびXPath値の組を取り、更新された値を持つXMLType
インスタンスを戻します。XPath_string
がXML要素の場合、対応するvalue_expr
はXMLType
インスタンスです。XPath_string
が属性またはテキスト・ノードの場合、value_expr
は任意のスカラー・データ型となります。先頭にスラッシュを付けて絶対XPath_string
を指定したり、先頭のスラッシュを省略して相対XPath_string
を指定できます。先頭のスラッシュを省略した場合、相対パスのコンテキストは、デフォルトでルート・ノードに設定されます。
各XPath_string
およびこれに対応するvalue_expr
のターゲットのデータ型は一致する必要があります。オプションのnamespace_string
は、接頭辞のデフォルト・マッピングまたはネームスペース・マッピング(Oracle DatabaseがXPath式を評価する場合に使用)を指定するVARCHAR2
値に解決される必要があります。
XML要素を更新してNULLにした場合、属性および子要素が削除されるため、要素は空になります。要素のテキスト・ノードを更新してNULLにした場合、その要素のテキスト値が削除されるため、要素自体は残りますが空になります。
多くの場合、このファンクションはメモリー内のXML文書を実体化して、その値を更新します。ただし、UPDATEXML
は、直接オブジェクト・リレーショナル列の値を更新するように、その列でのUPDATE
文に対して最適化されます。この最適化には、次の条件があります。
次の例では、サンプル・スキーマOE
(XMLType
型のwarehouse_spec
列を持つ)にあるSan Francisco倉庫のドック数を4に更新します。
SELECT warehouse_name, EXTRACT(warehouse_spec, '/Warehouse/Docks') "Number of Docks" FROM warehouses WHERE warehouse_name = 'San Francisco'; WAREHOUSE_NAME Number of Docks -------------------- -------------------- San Francisco <Docks>1</Docks> UPDATE warehouses SET warehouse_spec = UPDATEXML(warehouse_spec, '/Warehouse/Docks/text()',4) WHERE warehouse_name = 'San Francisco'; 1 row updated. SELECT warehouse_name, EXTRACT(warehouse_spec, '/Warehouse/Docks') "Number of Docks" FROM warehouses WHERE warehouse_name = 'San Francisco'; WAREHOUSE_NAME Number of Docks -------------------- -------------------- San Francisco <Docks>4</Docks>
UPPER
は、すべての文字を大文字にしてchar
を戻します。char
は、CHAR
、VARCHAR2
、NCHAR
、NVARCHAR2
、CLOB
またはNCLOB
データ型です。戻り値は、char
と同じデータ型です。データベースは、基礎となるキャラクタ・セットに対して定義したバイナリ・マッピングに基づいて文字の形式を設定します。大文字の区別については、「NLS_UPPER」を参照してください。
次の例では、各従業員の姓を大文字で戻します。
SELECT UPPER(last_name) "Uppercase" FROM employees;
USER
は、セッション・ユーザー(ログインしているユーザー)の名前をVARCHAR2
データ型で戻します。Oracle Databaseは、空白埋め比較セマンティクスでこのファンクションの値を比較します。
分散SQL文では、UID
ファンクションおよびUSER
ファンクションは、ローカル・データベース上のユーザーを識別します。CHECK制約の条件でこれらのファンクションは使用できません。
次の例では、現行のユーザーおよびユーザーのUIDを戻します。
SELECT USER, UID FROM DUAL;
注意:
|
USERENV
は現行のセッションについての情報を戻します。この情報は、アプリケーション固有の監査証跡表を書き込む場合、またはセッションで現在使用されている言語固有の文字を判断する場合に有効です。CHECK
制約の条件で、USERENV
は使用できません。表5-13に、parameter
引数の値を示します。
SESSIONID
およびENTRYID
パラメータを使用するコール(NUMBER
を戻す)以外のUSERENV
へのすべてのコールは、VARCHAR2
データを戻します。
パラメータ | 戻り値 |
---|---|
|
注意: 商業用のアプリケーションによっては、このコンテキスト値を使用する可能性があります。このコンテキスト領域の使用に対する制限については、これらのアプリケーションのドキュメントを参照してください。 参照:
|
|
現行の監査エントリ番号を戻します。監査エントリIDの順序は、ファイングレイン監査レコードと通常の監査レコードで共通です。この属性を分散SQL文で使用することはできません。 |
|
|
|
言語名のISO略称を戻します。これは、既存の' |
|
現行のセッションで使用している言語(language)および地域(territory)を、データベース・キャラクタ・セット(character set)も含めた次の書式で戻します。 language_territory.characterset |
|
監査セッション識別子を戻します。この属性を分散SQL文で使用することはできません。 |
|
現行のセッションの端末に対するオペレーティング・システム識別子を戻します。分散SQL文では、このパラメータはローカル・セッションの識別子を戻します。分散環境では、リモートの |
次の例では、現行のセッションのLANGUAGE
パラメータを戻します。
SELECT USERENV('LANGUAGE') "Language" FROM DUAL; Language ----------------------------------- AMERICAN_AMERICA.WE8ISO8859P1
VALUE
は、引数としてオブジェクト表の行に関連付けられた相関変数(表別名)を取り、オブジェクト表に格納されたオブジェクト・インスタンスを戻します。オブジェクト・インスタンスの型は、オブジェクト表と同じ型です。
次の例では、「置換可能な表および列のサンプル:」で作成されたoe.persons
サンプル表を使用します。
SELECT VALUE(p) FROM persons p; VALUE(P)(NAME, SSN) ------------------------------------------------------------- PERSON_T('Bob', 1234) EMPLOYEE_T('Joe', 32456, 12, 100000) PART_TIME_EMP_T('Tim', 5678, 13, 1000, 20)
VAR_POP
は、数値の集合にあるNULLを削除した後、この集合の母集団分散を戻します。これは、集計ファンクションまたは分析ファンクションとして使用できます。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。また、引数の数値データ型と同じデータ型を戻します。
ファンクションが空の集合に適用されると、NULLを戻します。このファンクションは、次の計算を行います。
(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr)
次の例では、employees
表にある給与の人口分散を計算します。
SELECT VAR_POP(salary) FROM employees; VAR_POP(SALARY) --------------- 15140307.5
次の例では、sh.sales
表での1998年における月ごとの売上について、累積の母集団および標本分散を計算します。
SELECT t.calendar_month_desc, VAR_POP(SUM(s.amount_sold)) OVER (ORDER BY t.calendar_month_desc) "Var_Pop", VAR_SAMP(SUM(s.amount_sold)) OVER (ORDER BY t.calendar_month_desc) "Var_Samp" FROM sales s, times t WHERE s.time_id = t.time_id AND t.calendar_year = 1998 GROUP BY t.calendar_month_desc ORDER BY t.calendar_month_desc, "Var_Pop", "Var_Samp"; CALENDAR Var_Pop Var_Samp -------- ---------- ---------- 1998-01 0 1998-02 2269111326 4538222653 1998-03 5.5849E+10 8.3774E+10 1998-04 4.8252E+10 6.4336E+10 1998-05 6.0020E+10 7.5025E+10 1998-06 5.4091E+10 6.4909E+10 1998-07 4.7150E+10 5.5009E+10 1998-08 4.1345E+10 4.7252E+10 1998-09 3.9591E+10 4.4540E+10 1998-10 3.9995E+10 4.4439E+10 1998-11 3.6870E+10 4.0558E+10 1998-12 4.0216E+10 4.3872E+10
VAR_SAMP
は、数値の集合にあるNULLを削除した後、この集合の標本分散を戻します。これは、集計ファンクションまたは分析ファンクションとして使用できます。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。また、引数の数値データ型と同じデータ型を戻します。
ファンクションが空の集合に適用されると、NULLを戻します。このファンクションは、次の計算を行います。
(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / (COUNT(expr) - 1)
このファンクションは、1つの要素の集合を入力するとVARIANCE
は0を戻し、VAR_SAMP
はNULLを戻すという点を除いては、VARIANCE
に似ています。
次の例では、サンプル表employees
にある給与の標本分散を計算します。
SELECT VAR_SAMP(salary) FROM employees; VAR_SAMP(SALARY) ---------------- 15283140.5
「VAR_POP」の分析の例を参照してください。
VARIANCE
はexpr
の分散を戻します。これは、集計ファンクションまたは分析ファンクションとして使用できます。
expr
の分散の計算結果は、次のようになります。
DISTINCT
を指定する場合は、analytic_clause
のquery_partition_clause
のみ指定できます。order_by_clause
およびwindowing_clause
は指定できません。
このファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。また、引数の数値データ型と同じデータ型を戻します。
次の例では、サンプル表employees
にあるすべての給与の合計を計算します。
SELECT VARIANCE(salary) "Variance" FROM employees; Variance ---------- 15283140.5
次の例では、雇用日で順序付けられた部門30の給与の値の累積分散を戻します。
SELECT last_name, salary, VARIANCE(salary) OVER (ORDER BY hire_date) "Variance" FROM employees WHERE department_id = 30 ORDER BY last_name, salary, "Variance"; LAST_NAME SALARY Variance ------------------------- ---------- ---------- Baida 2900 16283333.3 Colmenares 2500 11307000 Himuro 2600 13317000 Khoo 3100 31205000 Raphaely 11000 0 Tobias 2800 21623333.3
VSIZE
は、expr
の内部表現でのバイト数を戻します。expr
がNULLの場合はNULLを戻します。
このファンクションは、CLOB
データを直接的にサポートしていません。ただし、暗黙的なデータ変換を使用してCLOB
を引数として渡すことはできます。
次の例では、部門10の従業員のlast_name
列のバイト数を戻します。
SELECT last_name, VSIZE (last_name) "BYTES" FROM employees WHERE department_id = 10 ORDER BY employee_id; LAST_NAME BYTES --------------- ---------- Whalen 6
WIDTH_BUCKET
を使用すると、ヒストグラムの幅が同じサイズに分割された等幅ヒストグラムを作成できます。このファンクションと、等高ヒストグラムを作成するNTILE
を比較してください。各バケットが実際の数値線幅のclosed-open間隔であることが理想です。たとえば、間隔に10が含まれ20が排除されることを示すために、バケットは10.00〜19.999...のスコアに割り当てられます。これは、[10, 20]と表すこともできます。
指定された式に対して、WIDTH_BUCKET
は、この式の値が評価された後に該当するバケット数を戻します。
expr
は、ヒストグラムが作成される式です。この式は、数値または日時値、あるいは数値または日時値に暗黙的に変換可能な値に評価される必要があります。expr
がNULLと評価された場合、式はNULLを戻します。
min_value
およびmax_value
は、expr
の許容域のエンド・ポイントに解決される式です。これらの式は両方とも数値または日時値に評価される必要があり、いずれもNULLに評価されません。
num_buckets
は、バケット数を示す定数に解決される式です。この式は、正の整数に評価される必要があります。Oracle Databaseは、必要に応じて、0(ゼロ)の下位バケットおよびnum_buckets
+1の上位バケットを作成します。これらのバケットは、min_value
未満およびmax_value
より大きい値を処理し、エンド・ポイントの妥当性チェックに有効です。
次の例では、サンプル表oe.customers
のスイスの顧客のcredit_limit
列に10バケットのヒストグラムを作成し、各顧客のバケット数(「クレジット・グループ」)を戻します。最大値を超えるクレジット利用限度額を持つ顧客は、上位バケット11に割り当てられます。
SELECT customer_id, cust_last_name, credit_limit, WIDTH_BUCKET(credit_limit, 100, 5000, 10) "Credit Group" FROM customers WHERE nls_territory = 'SWITZERLAND' ORDER BY "Credit Group", customer_id, cust_last_name, credit_limit; CUSTOMER_ID CUST_LAST_NAME CREDIT_LIMIT Credit Group ----------- -------------------- ------------ ------------ 825 Dreyfuss 500 1 826 Barkin 500 1 827 Siegel 500 1 853 Palin 400 1 843 Oates 700 2 844 Julius 700 2 835 Eastwood 1200 3 836 Berenger 1200 3 837 Stanton 1200 3 840 Elliott 1400 3 841 Boyer 1400 3 842 Stern 1400 3 848 Olmos 1800 4 849 Kaurusmdki 1800 4 828 Minnelli 2300 5 829 Hunter 2300 5 850 Finney 2300 5 851 Brown 2300 5 852 Tanner 2300 5 830 Dutt 3500 7 831 Bel Geddes 3500 7 832 Spacek 3500 7 833 Moranis 3500 7 834 Idle 3500 7 838 Nicholson 3500 7 839 Johnson 3500 7 845 Fawcett 5000 11 846 Brando 5000 11 847 Streep 5000 11
XMLAGG
は集計ファンクションです。XMLフラグメントのコレクションを取り、集計されたXML文書を戻します。NULLを戻す引数は結果から排除されます。
XMLAGG
は、ノードのコレクションを戻す点を除いて、SYS_XMLAGG
に似ていますが、XMLFormat
オブジェクトを使用した書式設定は受け入れません。また、XMLAGG
は、SYS_XMLAGG
とは異なり、出力を要素タグで囲みません。
このorder_by_clause
にかぎり、他の使用方法とは異なり、数値リテラルは列の位置として認識されず、単に数値リテラルとして解釈されます。
次の例では、従業員のジョブIDと姓を要素の内容とするEmployee
要素を含むDepartment
要素を生成します。
SELECT XMLELEMENT("Department", XMLAGG(XMLELEMENT("Employee", e.job_id||' '||e.last_name) ORDER BY last_name)) as "Dept_list" FROM employees e WHERE e.department_id = 30; Dept_list ------------------------------------------------------------- <Department> <Employee>PU_CLERK Baida</Employee> <Employee>PU_CLERK Colmenares</Employee> <Employee>PU_CLERK Himuro</Employee> <Employee>PU_CLERK Khoo</Employee> <Employee>PU_MAN Raphaely</Employee> <Employee>PU_CLERK Tobias</Employee> </Department>
XMLAGG
が行を集計するため、結果は単一行となります。GROUP
BY
句を使用して、戻された行の集合を複数のグループにまとめることができます。
SELECT XMLELEMENT("Department", XMLAGG(XMLELEMENT("Employee", e.job_id||' '||e.last_name))) AS "Dept_list" FROM employees e GROUP BY e.department_id; Dept_list --------------------------------------------------------- <Department> <Employee>AD_ASST Whalen</Employee> </Department> <Department> <Employee>MK_MAN Hartstein</Employee> <Employee>MK_REP Fay</Employee> </Department> <Department> <Employee>PU_MAN Raphaely</Employee> <Employee>PU_CLERK Khoo</Employee> <Employee>PU_CLERK Tobias</Employee> <Employee>PU_CLERK Baida</Employee> <Employee>PU_CLERK Colmenares</Employee> <Employee>PU_CLERK Himuro</Employee> </Department> . . .
XMLCast
は、value_expression
をdatatype
で指定されたスカラーSQLデータ型にキャストします。value_expression
引数は、評価されるSQL式です。datatype
引数のデータ型は、NUMBER
、VARCHAR2
、および任意の日時データ型です。
XMLCData
は、value_expr
を評価してCDATAセクションを生成します。value_expr
は文字列に変換する必要があります。このファンクションの戻り値は、次の書式になります。
<![CDATA[string]]>
結果値が無効なXML CDATAセクションの場合は、エラーが戻されます。
次の条件がXMLCData
に適用されます。
次の文は、DUAL
表を使用して、XMLCData
の構文を示します。
SELECT XMLELEMENT("PurchaseOrder", XMLAttributes(dummy as "pono"), XMLCdata('<!DOCTYPE po_dom_group [ <!ELEMENT po_dom_group(student_name)*> <!ELEMENT po_purch_name (#PCDATA)> <!ATTLIST po_name po_no ID #REQUIRED> <!ATTLIST po_name trust_1 IDREF #IMPLIED> <!ATTLIST po_name trust_2 IDREF #IMPLIED> ]>')) "XMLCData" FROM DUAL; XMLCData ---------------------------------------------------------- <PurchaseOrder pono="X"><![CDATA[ <!DOCTYPE po_dom_group [ <!ELEMENT po_dom_group(student_name)*> <!ELEMENT po_purch_name (#PCDATA)> <!ATTLIST po_name po_no ID #REQUIRED> <!ATTLIST po_name trust_1 IDREF #IMPLIED> <!ATTLIST po_name trust_2 IDREF #IMPLIED> ]> ]]> </PurchaseOrder>
XMLCOLATTVAL
は、XMLフラグメントを作成し、各XMLフラグメントの名前がcolumn
、属性がname
となるように、結果としてできたXMLを展開します。
AS
句を使用して、name
属性の値を列名以外の値に変更できます。この場合、文字列リテラルのc_alias
を指定するか、またはEVALNAME
value_expr
を指定します。後者の場合は、値の式が評価され、その結果(文字列リテラル)が別名として使用されます。別名は、最大4000文字まで指定可能です。
value_expr
の値を指定する必要があります。value_expr
がNULLの場合、要素は戻されません。
value_expr
にオブジェクト型の列を指定することはできません。
次の例では、従業員のサブセットに対してEmp
要素を作成します。このとき、Emp
の内容として、employee_id
、last_name
およびsalary
の各要素がネストされます。ネストされた各要素にはcolumn
という名前が付き、属性値として列名を持つname
属性が与えられます。
SELECT XMLELEMENT("Emp", XMLCOLATTVAL(e.employee_id, e.last_name, e.salary)) "Emp Element" FROM employees e WHERE employee_id = 204; Emp Element -------------------------------------------------------------------- <Emp> <column name="EMPLOYEE_ID">204</column> <column name="LAST_NAME">Baer</column> <column name="SALARY">10000</column> </Emp>
これらの2つのファンクションの出力の比較については、「XMLFOREST」を参照してください。
XMLComment
は、value_expr
の評価結果を使用してXMLコメントを生成します。value_expr
は文字列に変換する必要があります。このファンクションには、2つの連続したダッシュ(ハイフン)を含めることはできません。このファンクションの戻り値は、次の書式になります。
<!--string-->
value_expr
がNULLである場合、このファンクションはNULLを戻します。
次の例は、DUAL
表を使用して、XMLComment
構文を示します。
SELECT XMLCOMMENT('OrderAnalysisComp imported, reconfigured, disassembled') AS "XMLCOMMENT" FROM DUAL; XMLCOMMENT -------------------------------------------------------------------------------- <!--OrderAnalysisComp imported, reconfigured, disassembled-->
XMLCONCAT
は、入力として一連のXMLType
インスタンスを取り、各行について一連の要素を連結し、連結した結果を戻します。XMLCONCAT
はXMLSEQUENCE
の逆の処理をします。
NULL式は結果から排除されます。値のすべての式がNULLの場合、このファンクションはNULLを戻します。
次の例では、従業員のサブセットの名前と姓に対してXML要素を作成し、作成した要素を連結して戻します。
SELECT XMLCONCAT(XMLELEMENT("First", e.first_name), XMLELEMENT("Last", e.last_name)) AS "Result" FROM employees e WHERE e.employee_id > 202; Result ---------------------------------------------------------------- <First>Susan</First> <Last>Mavris</Last> <First>Hermann</First> <Last>Baer</Last> <First>Shelley</First> <Last>Higgins</Last> <First>William</First> <Last>Gietz</Last> 4 rows selected.
XMLDiff
ファンクションは、XmlDiff C APIのSQLインタフェースです。このファンクションは、2つのXML文書を比較し、Xdiffスキーマに基づいたXMLの差異を取得します。diff文書がXMLType文書として戻されます。
integer
には、CファンクションXmlDiffのhashLevelを表す数値を指定します。ハッシュを使用しない場合は、この引数を0(ゼロ)に設定するか、または引数全体を省略します。ハッシュを使用しないでフラグを指定する場合は、この引数を0(ゼロ)に設定する必要があります。
string
には、ファンクションの動作を制御するフラグを指定します。これらのフラグは、セミコロンで区切られた1つ以上の名前で指定します。これらの名前は、XmlDiffファンクションの定数の名前と同じです。次の例では、2つのXML文書を比較し、差異をXMLType文書として戻します。
SELECT XMLDIFF( XMLTYPE('<?xml version="1.0"?> <bk:book xmlns:bk="http://nosuchsite.com"> <bk:tr> <bk:td> <bk:chapter> Chapter 1. </bk:chapter> </bk:td> <bk:td> <bk:chapter> Chapter 2. </bk:chapter> </bk:td> </bk:tr> </bk:book>'), XMLTYPE('<?xml version="1.0"?> <bk:book xmlns:bk="http://nosuchsite.com"> <bk:tr> <bk:td> <bk:chapter> Chapter 1. </bk:chapter> </bk:td> <bk:td/> </bk:tr> </bk:book>') ) FROM DUAL;
XMLELEMENT
は、identifier
に対する要素名を取るか、またはEVALNAME
value_expr
の要素名、要素に対する属性のオプションのコレクション、およびその要素の内容を構成する引数を評価します。このファンクションはXMLType
型のインスタンスを戻します。XMLELEMENT
は、戻されたXMLに属性を格納できる点を除いてSYS_XMLGEN
に似ていますが、XMLFormat
オブジェクトを使用した書式設定は受け入れません。
次の項に示すとおり、通常は、XMLELEMENT
ファンクションはネストされており、ネスト構造のXML文書を生成します。
ENTITYESCAPING
およびNONENTITYESCAPING
キーワードについては、『Oracle XML DB開発者ガイド』を参照してください。
囲みタグに使用するOracle Databaseの値を指定する必要があります。この場合、文字列リテラルのidentifier
を指定するか、またはEVALNAME
value_expr
を指定します。後者の場合は、値の式が評価され、その結果(文字列リテラル)が識別子として使用されます。この識別子は、最大4000文字まで指定可能で、列名または列の参照である必要はありません。式またはNULLは指定できません。
要素の内容を構成するオブジェクトは、XMLATTRIBUTES
キーワードの後に指定します。XML_attributes_clause
では、value_expr
がNULLの場合、その値の式に対する属性は作成されません。value_expr
の型に、オブジェクト型またはコレクションは指定できません。AS
句を使用してvalue_expr
に別名を指定すると、c_alias
または評価された値の式(EVALNAME
value_expr
)は、最大4000文字まで指定可能になります。
構文図のXML_attributes_clause
に続くオプションのvalue_expr
は、次のようになります。
value_expr
がスカラー式である場合、AS
句は省略できます。この場合、Oracleは列名を要素名として使用します。
value_expr
がオブジェクト型またはコレクションである場合、AS
句は必須です。この場合、Oracleは指定されたc_alias
を囲みタグとして使用します。
value_expr
がNULLの場合、その値の式に対する要素は作成されません。次の例では、一連の従業員について、従業員の名前と雇用日を指定する、ネストされた要素を持つEmp
要素を生成します。
SELECT XMLELEMENT("Emp", XMLELEMENT("Name", e.job_id||' '||e.last_name), XMLELEMENT("Hiredate", e.hire_date)) as "Result" FROM employees e WHERE employee_id > 200; Result ------------------------------------------------------------------- <Emp> <Name>MK_MAN Hartstein</Name> <Hiredate>17-FEB-96</Hiredate> </Emp> <Emp> <Name>MK_REP Fay</Name> <Hiredate>17-AUG-97</Hiredate> </Emp> <Emp> <Name>HR_REP Mavris</Name> <Hiredate>07-JUN-94</Hiredate> </Emp> <Emp> <Name>PR_REP Baer</Name> <Hiredate>07-JUN-94</Hiredate> </Emp> <Emp> <Name>AC_MGR Higgins</Name> <Hiredate>07-JUN-94</Hiredate> </Emp> <Emp> <Name>AC_ACCOUNT Gietz</Name> <Hiredate>07-JUN-94</Hiredate> </Emp> 6 rows selected.
次の例では、XMLELEMENT
ファンクションにXML_attributes_clause
を使用して、トップレベル要素に対する属性値を持つ、ネストされたXML要素を作成します。
SELECT XMLELEMENT("Emp", XMLATTRIBUTES(e.employee_id AS "ID", e.last_name), XMLELEMENT("Dept", e.department_id), XMLELEMENT("Salary", e.salary)) AS "Emp Element" FROM employees e WHERE e.employee_id = 206; Emp Element --------------------------------------------------------------- <Emp ID="206" LAST_NAME="Gietz"> <Dept>110</Dept> <Salary>8300</Salary> </Emp>
last_name
にはAS
identifier
句が指定されていません。その結果、戻されたXMLは、デフォルトで列名last_name
を使用します。
最後に、次の例では、XML_attributes_clause
に副問合せを使用して、別の表から要素の属性に情報を取り出します。
SELECT XMLELEMENT("Emp", XMLATTRIBUTES(e.employee_id, e.last_name), XMLELEMENT("Dept", XMLATTRIBUTES(e.department_id, (SELECT d.department_name FROM departments d WHERE d.department_id = e.department_id) as "Dept_name")), XMLELEMENT("salary", e.salary), XMLELEMENT("Hiredate", e.hire_date)) AS "Emp Element" FROM employees e WHERE employee_id = 205; Emp Element ------------------------------------------------------------------- <Emp EMPLOYEE_ID="205" LAST_NAME="Higgins"> <Dept DEPARTMENT_ID="110" Dept_name="Accounting"/> <salary>12000</salary> <Hiredate>07-JUN-94</Hiredate> </Emp>
XMLExists
は、指定されたXQuery式から空でないXQueryシーケンスが戻されるかどうかをチェックします。空でないXQueryシーケンスが戻される場合、このファンクションはTRUE
を戻し、それ以外の場合はFALSE
を戻します。引数XQuery_string
はリテラル文字列ですが、XML_passing_clause
を使用してバインドするXQuery変数を含めることができます。
XML_passing_clause
のexpr
は、XMLType
またはSQLスカラー・データ型のインスタンスを戻し、XQuery式を評価するためのコンテキストとして使用されます。PASSING
句には、識別子を指定せずに1つのexpr
のみを指定できます。各expr
の評価結果は、XQuery_string
の対応する識別子にバインドされます。expr
の後にAS
句が続かない場合、式の評価結果はXQuery_string
の評価用のコンテキスト項目として使用されます。
XMLFOREST
は、各引数パラメータをXMLに変換し、変換された引数を連結したXMLフラグメントを戻します。
value_expr
がスカラー式である場合、AS
句は省略できます。この場合、Oracle Databaseは列名を要素名として使用します。
value_expr
がオブジェクト型またはコレクションである場合、AS
句は必須です。この場合、Oracleは指定された式を囲みタグとして使用します。この場合、文字列リテラルのc_alias
を指定するか、またはEVALNAME
value_expr
を指定します。後者の場合は、値の式が評価され、その結果(文字列リテラル)が識別子として使用されます。この識別子は、最大4000文字まで指定可能で、列名または列の参照である必要はありません。式またはNULLは指定できません。
value_expr
がNULLの場合、そのvalue_expr
に対する要素は作成されません。
次の例では、従業員のサブセットに対してEmp
要素を作成します。このとき、Emp
の内容として、employee_id
、last_name
およびsalary
の各要素がネストされます。
SELECT XMLELEMENT("Emp", XMLFOREST(e.employee_id, e.last_name, e.salary)) "Emp Element" FROM employees e WHERE employee_id = 204; Emp Element ---------------------------------------------------------------- <Emp> <EMPLOYEE_ID>204</EMPLOYEE_ID> <LAST_NAME>Baer</LAST_NAME> <SALARY>10000</SALARY> </Emp>
これらの2つのファンクションの出力の比較については、「XMLCOLATTVAL」を参照してください。
XMLParse
は、value_expr
の評価結果からXMLインスタンスを解析して生成します。value_expr
は文字列に変換する必要があります。value_expr
がNULLである場合、このファンクションはNULLを戻します。
DOCUMENT
を指定する場合、value_expr
は単一ルートのXML文書である必要があります。
CONTENT
を指定する場合、value_expr
は有効なXML値である必要があります。
WELLFORMED
を指定する場合、value_expr
は整形式XML文書である必要があります。これは、入力が正しい書式であることを確認する、データベースによる妥当性チェックが実行されないためです。次の例は、DUAL
表を使用して、XMLParse
の構文を示します。
SELECT XMLPARSE(CONTENT '124 <purchaseOrder poNo="12435"> <customerName> Acme Enterprises</customerName> <itemNo>32987457</itemNo> </purchaseOrder>' WELLFORMED) AS PO FROM DUAL; PO ----------------------------------------------------------------- 124 <purchaseOrder poNo="12435"> <customerName> Acme Enterprises</customerName> <itemNo>32987457</itemNo> </purchaseOrder>
XMLPatch
ファンクションは、XmlPatch C APIのSQLインタフェースです。このファンクションは、指定された変更を適用してXML文書を修正します。修正されたXMLType
文書が戻されます。
XMLType
文書の名前を指定します。2番目の引数には、最初の文書に適用する変更を含むXMLType文書を指定します。変更は、Xdiff XMLスキーマに基づいている必要があります。
string
には、ファンクションの動作を制御するフラグを指定します。これらのフラグは、セミコロンで区切られた1つ以上の名前で指定します。これらの名前は、XmlPatch Cファンクションの定数の名前と同じです。次の例では、別のXMLType
文書に指定された変更を適用してXMLType
文書を修正し、修正したXMLType
文書を戻します。
SELECT XMLPATCH( XMLTYPE('<?xml version="1.0"?> <bk:book xmlns:bk="http://nosuchsite.com"> <bk:tr> <bk:td> <bk:chapter> Chapter 1. </bk:chapter> </bk:td> <bk:td> <bk:chapter> Chapter 2. </bk:chapter> </bk:td> </bk:tr> </bk:book>'), XMLTYPE('<?xml version="1.0"?> <xd:xdiff xsi:schemaLocation="http://xmlns.example.com/xdb/xdiff.xsd http://xmlns.example.com/xdb/xdiff.xsd" xmlns:xd="http://xmlns.example.com/xdb/xdiff.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bk="http://nosuchsite.com"> <?oracle-xmldiff operations-in-docorder="true" output-model="snapshot" diff-algorithm="global"?> <xd:delete-node xd:node-type="element" xd:xpath="/bk:book[1]/bk:tr[1]/bk:td[2]/bk:chapter[1]"/> </xd:xdiff>') ) FROM DUAL;
XMLPI
は、identifier
とvalue_expr
の評価結果(オプション)を使用して、XMLの処理命令を生成します。通常、処理命令は、XML文書のすべてまたは一部に関連付けられたアプリケーション情報に使用されます。アプリケーションはこの処理命令を使用して、XML文書の最適な処理方法を決定します。
囲みタグに使用するOracle Databaseの値を指定する必要があります。この場合、文字列リテラルのidentifier
を指定するか、またはEVALNAME
value_expr
を指定します。後者の場合は、値の式が評価され、その結果(文字列リテラル)が識別子として使用されます。この識別子は、最大4000文字まで指定可能で、列名または列の参照である必要はありません。式またはNULLは指定できません。
オプションのvalue_expr
は文字列に変換する必要があります。オプションのvalue_expr
を指定しない場合、デフォルトは長さが0(ゼロ)の文字列です。このファンクションの戻り値は、次の書式になります。
<?identifier string?>
XMLPI
には、次の制限事項があります。
identifier
は、処理命令の有効な対象である必要があります。
xml
は、identifier
と組み合せて指定することはできません。
identifier
には、連続文字?>
を含めることはできません。次の文は、DUAL
表を使用して、XMLPI
の構文の使用を示します。
SELECT XMLPI(NAME "Order analysisComp", 'imported, reconfigured, disassembled') AS "XMLPI" FROM DUAL; XMLPI -------------------------------------------------------------------------------- <?Order analysisComp imported, reconfigured, disassembled?>
XMLQUERY
では、SQL文のXMLデータを問い合せることができます。このファンクションは、文字列リテラル、オプションのコンテキスト項目、および他のバインド変数としてXQuery式を取り、これらの入力値を使用してXQuery式の評価結果を戻します。
XQuery_string
は、プロローグを含む完全なXQuery式です。
XML_passing_clause
のexpr
は、XMLType
またはSQLスカラー・データ型のインスタンスを戻し、XQuery式を評価するためのコンテキストとして使用されます。PASSING
句には、識別子を指定せずに1つのexpr
のみを指定できます。各expr
の評価結果は、XQuery_string
の対応する識別子にバインドされます。expr
の後にAS
句が続かない場合、式の評価結果はXQuery_string
の評価用のコンテキスト項目として使用されます。
RETURNING
CONTENT
は、XQuery式の評価結果がXML 1.0文書か、またはXML 1.0セマンティクスに準拠したドキュメント・フラグメントのいずれかであることを示します。
NULL
値を戻します。NULL
ON
EMPTY
キーワードがデフォルトで実装されます。このキーワードは、意味を明確にするために示されます。次の文では、XML_passing_clause
のoe.warehouses
表のwarehouse_spec
列をコンテキスト項目として指定します。この文は、領域が50Kより大きいウェアハウスに関する特定の情報を戻します。
SELECT warehouse_name, EXTRACTVALUE(warehouse_spec, '/Warehouse/Area'), XMLQuery( 'for $i in /Warehouse where $i/Area > 50000 return <Details> <Docks num="{$i/Docks}"/> <Rail> { if ($i/RailAccess = "Y") then "true" else "false" } </Rail> </Details>' PASSING warehouse_spec RETURNING CONTENT) "Big_warehouses" FROM warehouses; WAREHOUSE_ID Area Big_warehouses ------------ --------- -------------------------------------------------------- 1 25000 2 50000 3 85700 <Details><Docks></Docks><Rail>false</Rail></Details> 4 103000 <Details><Docks num="3"></Docks><Rail>true</Rail></Details> . . .
XMLROOT
では、既存のXML値のXMLルート情報(プロローグ)のバージョンとスタンドアロンのプロパティを指定して、新しいXML値を作成できます。value_expr
がすでにプロローグを持っている場合、エラーが戻されます。入力がNULLの場合、このファンクションはNULLを戻します。
戻り値は次の書式になります。
<?xml version = "version" [ STANDALONE = "{yes | no}" ]?>
value_expr
では、XML値を指定します。この値に対してプロローグ情報を指定します。
VERSION
句のvalue_expr
は、有効なXMLバージョンを表す文字列である必要があります。VERSION
にNO
VALUE
を指定すると、バージョンはデフォルトで1.0になります。
STANDALONE
句を指定しない場合や、NO
VALUE
を指定した場合は、ファンクションの戻り値にスタンドアロンのプロパティは存在しません。
次の文は、DUAL
表を使用して、XMLROOT
の構文を示します。
SELECT XMLROOT ( XMLType('<poid>143598</poid>'), VERSION '1.0', STANDALONE YES) AS "XMLROOT" FROM DUAL; XMLROOT -------------------------------------------------------------------------------- <?xml version="1.0" standalone="yes"?> <poid>143598</poid>
XMLSEQUENCE
には2つの書式があります。
XMLType
インスタンスを取り、XMLType
にあるトップレベルのノードのVARRAYを戻します。この書式のかわりに、SQL/XML標準関数XMLTable
を使用すると効果的です。この関数を使用すると、SQLコードがより読みやすくなります。Oracle Database10g リリース2(10.2)より前のリリースでは、このリリースのXMLTable
関数でより効果的に実行されるいくつかの機能を、XMLSequence
がSQL関数TABLE
を使用して実行していました。
REFCURSOR
インスタンスおよびオプションのXMLFormat
オブジェクトのインスタンスを取り、カーソルの各行に対して、XMLSequence
型としてXML文書を戻します。
XMLSEQUENCE
はXMLType
のコレクションを戻すため、このファンクションをTABLE
句で使用して、コレクション値をネスト解除することで複数行にし、SQL問合せでの処理をさらに進めることができます。
次の例では、XMLSEQUENCE
が複数の要素を持つXML文書をVARRAY
型の単一要素ドキュメントに分割する方法を示しています。この例では、TABLE
キーワードが、コレクションを副問合せのFROM
句で使用できる表の値とみなすように、Oracle Databaseに指示しています。
SELECT EXTRACT(warehouse_spec, '/Warehouse') as "Warehouse" FROM warehouses WHERE warehouse_name = 'San Francisco'; Warehouse ------------------------------------------------------------ <Warehouse> <Building>Rented</Building> <Area>50000</Area> <Docks>1</Docks> <DockType>Side load</DockType> <WaterAccess>Y</WaterAccess> <RailAccess>N</RailAccess> <Parking>Lot</Parking> <VClearance>12 ft</VClearance> </Warehouse> 1 row selected. SELECT VALUE(p) FROM warehouses w, TABLE(XMLSEQUENCE(EXTRACT(warehouse_spec, '/Warehouse/*'))) p WHERE w.warehouse_name = 'San Francisco'; VALUE(P) ---------------------------------------------------------------- <Building>Rented</Building> <Area>50000</Area> <Docks>1</Docks> <DockType>Side load</DockType> <WaterAccess>Y</WaterAccess> <RailAccess>N</RailAccess> <Parking>Lot</Parking> <VClearance>12 ft</VClearance> 8 rows selected.
XMLSerialize
は、value_expr
の内容を含む文字列またはLOBを作成します。
DOCUMENT
を指定する場合、value_expr
は有効なXML文書である必要があります。
CONTENT
を指定する場合、value_expr
は単一ルートのXML文書である必要はありません。ただし、有効なXMLコンテンツである必要があります。
datatype
は、文字列型(VARCHAR2
またはVARCHAR
は使用可能、NVARCHAR
またはNVARCHAR2
は使用不可)、BLOB
またはCLOB
です。デフォルトはCLOB
です。
datatype
がBLOB
の場合は、ENCODING
句を指定して、指定したエンコーディングをプロローグで使用できます。
string_literal
として指定したバージョン(<?xml version="..." ...?>
)を使用するには、VERSION
句を指定します。
NO INDENT
を指定します。出力をN
個の空白の相対インデントを使用して出力整形するには、INDENT SIZE =
N
を指定します。N
は整数です。N
が0
の場合、出力整形によって各要素の後に改行文字が挿入され、各要素は独自の行に配置されますが、その他の意味のないすべての空白は出力で省略されます。SIZE
を指定せずにINDENT
を指定すると、2個の空白インデントが使用されます。この句を指定しない場合、動作(出力整形されるかどうか)は予測不能です。
HIDE DEFAULTS
およびSHOW DEFAULTS
は、XMLスキーマベースのデータにのみ適用されます。SHOW DEFAULTS
を指定し、XMLスキーマがデフォルト値を定義するオプションの要素または属性が入力データにない場合、それらの要素または属性はデフォルト値を使用して出力に含まれます。HIDE DEFAULTS
を指定した場合、そのような要素または属性は出力に含まれません。HIDE DEFAULTS
がデフォルトの動作です。次の文は、DUAL
表を使用して、XMLSerialize
の構文を示します。
SELECT XMLSERIALIZE(CONTENT XMLTYPE('<Owner>Grandco</Owner>')) FROM DUAL;
XMLTable
は、XQueryの評価結果をリレーショナル行および列にマップします。SQLを使用して、このファンクションで戻される結果を仮想リレーショナル表として問い合せることができます。
XMLNAMESPACES
句には、XMLネームスペースの宣言が含まれます。これらの宣言は、XQuery式(評価されたXQuery_string
)と、XML_table_column
のPATH
句のXPath式で参照されます。XQuery式は行を計算し、XPath式はXMLTable
ファンクション全体の列を計算します。COLUMNS
句のPATH
式に修飾名を使用する場合は、XMLNAMESPACES
句を指定する必要があります。
XQuery_string
は、完全なXQuery式で、プロローグ宣言を含むことができます。
XML_passing_clause
のexpr
は、XMLType
またはSQLスカラー・データ型のインスタンスを戻し、XQuery式を評価するためのコンテキストとして使用されます。PASSING
句には、識別子を指定せずに1つのexpr
のみを指定できます。各expr
の評価結果は、XQuery_string
の対応する識別子にバインドされます。expr
の後にAS
句が続かない場合、式の評価結果はXQuery_string
の評価用のコンテキスト項目として使用されます。
COLUMNS
句では、XMLTable
で作成する仮想表の列を定義します。
COLUMNS
句を指定しない場合、XMLTable
は、COLUMN_VALUE
という名前の単一のXMLType
疑似列を戻します。
XMLTable
がXMLType
, datatype
というXMLスキーマ・ベースの記憶域とともに使用される場合以外は、datatype
が必要です。この場合、datatype
の指定を省略すると、Oracle XML DBは、XMLスキーマに基づいてデータ型を推測します。データベース側で、ノードの正しい型が判断できないときは、デフォルト型であるVARCHAR2(4000)
が使用されます。
FOR
ORDINALITY
は、生成された行番号の列になるように指定します。FOR
ORDINALITY
句は、最大で1つにする必要があります。これは、NUMBER
列として作成されます。
PATH
句では、XQuery式の文字列でアドレス指定されるXQuery結果の部分を列の内容として使用するように指定します。PATH
を指定しない場合、XQuery式のcolumn
とみなされます。たとえば、次のようになります。
XMLTable(... COLUMNS xyz
これは、次の式と同じです。
XMLTable(... COLUMNS xyz PATH 'XYZ')
異なるPATH
句を使用すると、XQuery結果を異なる仮想表の列に分割できます。
DEFAULT
句では、PATH
式の結果が空のシーケンスの場合に使用する値を指定します。expr
は、デフォルト値の生成用に評価するXQuery式です。次の例では、warehouses
表のwarehouse_spec
列の各値にXQuery '/Warehouse'
を適用した結果を、列Water
およびRail
のある仮想リレーショナル表に変換します。
SELECT warehouse_name warehouse, warehouse2."Water", warehouse2."Rail" FROM warehouses, XMLTABLE('/Warehouse' PASSING warehouses.warehouse_spec COLUMNS "Water" varchar2(6) PATH '/Warehouse/WaterAccess', "Rail" varchar2(6) PATH '/Warehouse/RailAccess') warehouse2; WAREHOUSE Water Rail ----------------------------------- ------ ------ Southlake, Texas Y N San Francisco Y N New Jersey N N Seattle, Washington N Y
XMLTRANSFORM
は、引数としてXMLType
インスタンスおよびXSLスタイルシート(それ自体がXMLType
インスタンス)を取ります。このファンクションは、スタイルシートをインスタンスに適用して、XMLType
を戻します。
このファンクションは、データをデータベースから取得するように、スタイルシートに従ってデータを編成する場合に有効です。
XMLTRANSFORM
ファンクションを使用するには、XSLスタイルシートが必要です。次に、ノード内の要素をアルファベット順に並べる単純なスタイルシートの例を示します。
CREATE TABLE xsl_tab (col1 XMLTYPE); INSERT INTO xsl_tab VALUES ( XMLTYPE.createxml( '<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:output encoding="utf-8"/> <!-- alphabetizes an xml tree --> <xsl:template match="*"> <xsl:copy> <xsl:apply-templates select="*|text()"> <xsl:sort select="name(.)" data-type="text" order="ascending"/> </xsl:apply-templates> </xsl:copy> </xsl:template> <xsl:template match="text()"> <xsl:value-of select="normalize-space(.)"/> </xsl:template> </xsl:stylesheet> ')); 1 row created.
次の例では、XSLスタイルシートxsl_tab
を使用して、サンプル表oe.warehouses
にあるwarehouse_spec
の要素をアルファベット順に並べます。
SELECT XMLTRANSFORM(w.warehouse_spec, x.col1).GetClobVal() FROM warehouses w, xsl_tab x WHERE w.warehouse_name = 'San Francisco'; XMLTRANSFORM(W.WAREHOUSE_SPEC,X.COL1).GETCLOBVAL() -------------------------------------------------------------------------------- <Warehouse> <Area>50000</Area> <Building>Rented</Building> <DockType>Side load</DockType> <Docks>1</Docks> <Parking>Lot</Parking> <RailAccess>N</RailAccess> <VClearance>12 ft</VClearance> <WaterAccess>Y</WaterAccess> </Warehouse>
表5-14に、ROUND
およびTRUNC
日付ファンクションで使用できる書式モデル、および日付の丸めと切捨ての単位を示します。デフォルトのモデルDDでは、午前0時(真夜中)を基準に丸めおよび切捨てを行い、日付を戻します。
書式モデルDAY、DYおよびDによって使用される週の開始日は、NLS_TERRITORY
初期化パラメータによって暗黙的に指定されています。
PL/SQLまたはJavaでユーザー定義ファンクションを作成し、SQLまたはSQL組込みファンクションにはない機能を持たせることができます。ユーザー定義ファンクションは、式を指定できる場所であればどこでも、SQL文に指定できます。
たとえば、SQL文の次の場所でユーザー定義ファンクションを使用できます。
SELECT
文のSELECT構文のリスト
WHERE
句の条件
CONNECT
BY
句、START
WITH
句、ORDER
BY
句およびGROUP
BY
句
INSERT
文のVALUES
句
UPDATE
文のSET
句オプションの式のリストは、ファンクション、パッケージまたは演算子の属性と一致する必要があります。
DISTINCT
およびALL
キーワードは、ユーザー定義集計ファンクションのみで有効です。
参照:
|
ユーザー定義ファンクションをSQL文で使用するには、トップレベル・ファンクションとして作成するか、またはパッケージ仕様部で宣言する必要があります。
SQLの式の中でユーザー・ファンクションを使用するには、ユーザーがユーザー・ファンクションのEXECUTE
権限を持っている必要があります。ユーザー・ファンクションで定義したビューを問い合せるには、そのビューに対するSELECT
権限が必要です。ビューから選択するには、個別のEXECUTE
権限は必要ありません。
SQL文内では、データベースの列名は、パラメータなしのファンクション名より優先順位が高くなります。たとえば、Human Resourcesのマネージャが、hr
スキーマに次の2つのオブジェクトを作成する場合は、次のようにします。
CREATE TABLE new_emps (new_sal NUMBER, ...); CREATE FUNCTION new_sal RETURN NUMBER IS BEGIN ... END;
その後、次の2つの文のように、new_sal
を参照するとnew_emps.new_sal
列を参照することになります。
SELECT new_sal FROM new_emps; SELECT new_emps.new_sal FROM new_emps;
new_sal
ファンクションにアクセスするには、次のように入力します。
SELECT hr.new_sal FROM new_emps;
SQLの式内で使用できるユーザー・ファンクションのコール例を次に示します。
circle_area (radius) payroll.tax_rate (empno) hr.employees.tax_rate (dependent, empno)@remote
hr
スキーマからtax_rate
ユーザー・ファンクションをコールし、tax_table
内のss_no
列とsal
列に対してこのファンクションを実行するには、次のように指定します。
SELECT hr.tax_rate (ss_no, sal) INTO income_tax FROM tax_table WHERE ss_no = tax_id;
INTO
句は、結果をincome_tax
変数に配置するために使用できるPL/SQLです。
オプションのスキーマ名またはパッケージ名を1つのみ指定すると、最初の識別子はスキーマ名またはパッケージ名のいずれかになります。たとえば、PAYROLL
.TAX_RATE
という参照内のPAYROLL
がスキーマ名かパッケージ名かを判断するには、Oracle Databaseは次の手順を実行します。
PAYROLL
パッケージをチェックします。
PAYROLL
パッケージが検出されない場合は、トップレベルのTAX_RATE
ファンクションを含むスキーマ名PAYROLL
を検索します。このようなファンクションが検出されない場合は、エラーを戻します。
PAYROLL
パッケージが検出されると、PAYROLL
パッケージの中でTAX_RATE
ファンクションを検索します。このようなファンクションが検出されない場合は、エラーを戻します。
また、ユーザーが定義したシノニムを使用して、ストアド・トップレベル・ファンクションを参照することもできます。
|
![]() Copyright © 1996, 2008, Oracle Corporation. All Rights Reserved. |
|