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