ORA_HASH
構文
目的
ORA_HASH
ファンクションは、指定された式のハッシュ値を計算します。このファンクションは、データのサブセットを分析しランダムなサンプルを生成するために使用します。
-
expr
引数には、Oracle Databaseでハッシュ値を計算するデータを指定します。expr
に指定できるデータの長さに制限はありません。このデータは通常、列名です。expr
は、LONG
型またはLOB型にすることはできません。また、ネストした表型でない場合は、ユーザー定義オブジェクト型にすることはできません。ネストした表型のハッシュ値は、コレクション内の要素の順序に依存しません。その他のデータ型はすべて、expr
でサポートされています。 -
オプションの
max_bucket
引数には、ハッシュ・ファンクションから戻される最大バケット値を指定します。0(ゼロ)から4294967295の任意の値を指定できます。デフォルト値は4294967295です。なお、デフォルトのハッシュ値は、32ビットの符号なし数値です。デフォルトの
max_bucket
である2^32-1
では、単にこの値が返されます。バケット化は、
MOD
ファンクションを使用してデフォルト値に対して実行されます。max_bucket
= Nの場合、バケット値は、(デフォルトのハッシュ値)MOD
(N + 1)によって計算され、その結果は、0からNまでのバケット値になります。この手法ではすべてのバケットの間で値が統計的に均一に配分されることはなく、N + 1が2の累乗である場合以外は小さいバケット番号に偏ることに注意してください。これは、
max_bucket
(つまり、N)がデフォルト(4294967295)に対して小さい場合はそれほどでもありませんが、max_bucket
の値が非常に大きい場合、特にそのデフォルトの桁の範囲内の場合は(たとえば、1億を超える場合)、顕著になる場合があります。 -
オプションの
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