8.4.6 RANDOMCURSOR
RANDOMCURSORは,次の条件を満たす値を返します。
-
最小値に指定した値以上,かつ最大値に指定した値未満の範囲での一様分布に従う擬似乱数を返します。
-
検索系SQLの場合,カーソルがオープンしている間は,常に同じ値を返します。更新系SQLの場合は,SQL文を実行している間は,常に同じ値を返します。
-
1SQL文中で,同じ識別番号を指定したRANDOMCURSORは,常に同じ値を返します。
なお,RANDOMCURSORのほかにも擬似乱数を返すスカラ関数が幾つかあります。擬似乱数を返すスカラ関数の仕様差を確認して,用途に合ったスカラ関数を使用してください。擬似乱数を返すスカラ関数の仕様差については,「8.4.5 RANDOM」の「(6) 擬似乱数を返すスカラ関数の一覧」を参照してください。
- 〈この項の構成〉
(1) 指定形式
スカラ関数RANDOMCURSOR::=RANDOMCURSOR(識別番号〔,最小値,最大値〕) 識別番号::=符号なし整数定数 最小値::=値指定 最大値::=値指定
(2) 指定形式の説明
- 識別番号:
-
1から1000までの整数値を指定します。1SQL文中で,同じ識別番号を指定したRANDOMCURSORは,常に同じ値を返します。
- 最小値:
-
乱数を生成する範囲の最小値(この値を含む)を指定します。最小値と最大値の指定を省略した場合,最小値には0が仮定されます。
指定規則を次に示します。
-
最小値は,値指定の形式で指定します。値指定については,「7.22 値指定」を参照してください。
-
最小値には,数データを指定してください。数データについては,「6.2.1 データ型の種類」の「(1) 数データ」を参照してください。
-
最小値に?パラメタを指定した場合,DOUBLE PRECISION型が仮定されます。
-
- 最大値:
-
乱数を生成する範囲の最大値(この値を含まない)を指定します。最小値と最大値の指定を省略した場合,最大値には1が仮定されます。
指定規則を次に示します。
-
最大値は,値指定の形式で指定します。値指定については,「7.22 値指定」を参照してください。
-
最大値には,数データを指定してください。数データについては,「6.2.1 データ型の種類」の「(1) 数データ」を参照してください。
-
最大値に?パラメタを指定した場合,DOUBLE PRECISION型が仮定されます。
-
(3) 規則
-
このスカラ関数は,次の個所に指定できます。
-
問合せ指定の選択式
-
ORDER BY句(WITHINグループ指定,およびウィンドウ順序句中のORDER BY句には指定できません)
-
-
同じ識別番号を指定したRANDOMCURSORを1SQL文中に複数指定する場合,次のどちらかの規則に従って指定してください。
-
最小値と最大値を指定したRANDOMCURSORを1つだけ指定し,それ以外のすべてのRANDOMCURSORは最小値と最大値を省略してください。
(例)正しいSQL文の例
SELECT "C1"+RANDOMCURSOR(1,10,20),"C2"+RANDOMCURSOR(1) FROM "T1" UNION ALL SELECT "C3"+RANDOMCURSOR(1),"C4"+RANDOMCURSOR(1) FROM "T2"
(例)エラーになるSQL文の例
SELECT "C1"+RANDOMCURSOR(1,10,20),"C2"+RANDOMCURSOR(1) FROM "T1" UNION ALL SELECT "C3"+RANDOMCURSOR(1,10,20),"C4"+RANDOMCURSOR(1) FROM "T2"
-
すべてのRANDOMCURSORの最小値と最大値を省略してください。
(例)正しいSQL文の例
SELECT "C1"+RANDOMCURSOR(1),"C2"+RANDOMCURSOR(1) FROM "T1" UNION ALL SELECT "C3"+RANDOMCURSOR(1),"C4"+RANDOMCURSOR(1) FROM "T2"
-
-
1SQL文中で,同じ識別番号を指定したRANDOMCURSORは,常に同じ値を返します。
(例)
SELECT "C1"+ RANDOMCURSOR(1,10,20), ...[a] "C2"+ RANDOMCURSOR(1), ...[a] "C3"+ RANDOMCURSOR(2), ...[b] "C4"+ RANDOMCURSOR(2) ...[b] FROM "T1" UNION ALL SELECT "C1"+ RANDOMCURSOR(1), ...[a] "C2"+ RANDOMCURSOR(1), ...[a] "C3"+ RANDOMCURSOR(2,20,30), ...[b] "C4"+ RANDOMCURSOR(2) ...[b] FROM "T2"
[説明]
-
識別番号に1を指定したRANDOMCURSORです。それぞれの関数は,常に同じ値(10以上20未満の値)を返します。
-
識別番号に2を指定したRANDOMCURSORです。それぞれの関数は,常に同じ値(20以上30未満の値)を返します。
-
-
次に示す識別番号が重複した場合,重複した識別番号をHADBが自動的に変更します。そのため,SQL文はエラーになりません。
-
ビュー表の定義時(CREATE VIEW文)に指定した識別番号
-
ビュー表を指定したSQL文中に指定した識別番号
(例)
ビュー表V1の定義
CREATE VIEW "V1"("VC1","VC2") AS SELECT "C1"+RANDOMCURSOR(1,10,20),"C2"+RANDOMCURSOR(1) FROM "T1"
ビュー表V1を検索するSQL文
SELECT "VC1"+RANDOMCURSOR(1,10,20),"VC2"+RANDOMCURSOR(1) FROM "V1"
上記のSELECT文は,HADBが次のように等価変換します。
SELECT "VC1"+RANDOMCURSOR(1,10,20),"VC2"+RANDOMCURSOR(1) FROM (SELECT "C1"+RANDOMCURSOR(2,10,20),"C2"+RANDOMCURSOR(2) FROM "T1") "V1"("VC1","VC2")
下線部分の識別番号を,1から2にHADBが自動的に変更するため,このSELECT文はエラーになりません。このように,ビュー表の定義時に指定した識別番号をHADBが自動的に変更します。
-
-
1SQL文中に指定できるRANDOMCURSORの識別番号の種類の上限は,1,000となります。SQL文中にビュー表を指定している場合,CREATE VIEW文に指定したRANDOMCURSORの識別番号の種類の数も加算されて合計した数の上限が1,000となります。
-
RANDOMCURSORとRANDOMROWに同じ識別番号を指定できます。この場合,各スカラ関数は個別に生成した擬似乱数を返します。
(例)
SELECT RANDOMCURSOR(1,10,20) AS "C1", RANDOMROW(1,10,20) AS "C2" FROM "T1"
実行結果の例
-
カーソルオープン時に擬似乱数が生成されるため,カーソルオープンのたびにRANDOMCURSORの結果が変わります。
-
実行結果のデータ型は,DOUBLE PRECISION型になります。
-
実行結果の値は,非ナル値制約なし(ナル値を許す)となります。
-
最小値または最大値がナル値の場合,実行結果もナル値になります。
-
最小値と最大値をそれぞれDOUBLE PRECISION型に変換したあとで,実行結果を計算します。
-
最小値に指定した値Aと,最大値に指定した値Bの関係が,「A > B」を満たす場合,自動的に最小値と最大値を入れ替えます。そして,「B以上A未満」の範囲での一様分布に従う擬似乱数を返します。
-
最小値と最大値に同じ値を指定した場合,実行結果は最小値に指定した値になります。
-
実行結果のデータ型で実行結果を表現できない場合,オーバフローエラーになります。
-
最大値に0を指定した場合,実行結果に+0を返すことがあります。
(4) 留意事項
このスカラ関数は,暗号用途への使用には適していません。
(5) 例題
- 例題
-
患者の入院日と退院日を,次の条件を満たすように加工します。
-
入院期間が変わらないように,入院日と退院日を加工します。入院日と退院日に同じ日数を加算し,加工後の入院日,加工後の退院日にします。
-
加工後の入院日,加工後の退院日には,0〜6日の同じだけの日数を加算します。
-
検索結果は,加工後の入院日順に並べます。
(例)
SELECT "患者ID","入院日","退院日", "入院日"+CAST(RANDOMCURSOR(1,0,7) AS INTEGER) DAY AS "加工後の入院日", "退院日"+CAST(RANDOMCURSOR(1) AS INTEGER) DAY AS "加工後の退院日" FROM "入院履歴表" ORDER BY "入院日"+CAST(RANDOMCURSOR(1) AS INTEGER) DAY
実行結果の例
-