Hitachi

Hitachi Advanced Data Binder SQLリファレンス


8.4.7 RANDOMROW

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) 規則

  1. このスカラ関数は,次の個所に指定できます。

    • 問合せ指定の選択式

    • ORDER BY句(WITHINグループ指定,およびウィンドウ順序句中のORDER BY句には指定できません)

  2. RANDOMROW中の値式に,RANDOMROWを指定することはできません。

    ただし,RANDOMROWに指定した副問合せ中には,RANDOMROWを指定できます。

    (例)エラーになるSQL文の例

    RANDOMROW(1,0,RANDOMROW(1))

    (例)正しいSQL文の例

    RANDOMROW(1,0,(SELECT RANDOMROW(1) FROM "T1"))
  3. 同じ識別番号を指定した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"
  4. 問合せ指定の結果の行ごとに擬似乱数が生成されるため,問合せ指定の結果の行ごとにRANDOMROWの結果が変わります。

  5. 同じ識別番号を指定した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. 識別番号に1を指定したRANDOMROWです。問合せ指定の結果の行ごとに同じ値(10以上20未満の値)を返します。

    2. 識別番号に2を指定したRANDOMROWです。問合せ指定の結果の行ごとに同じ値(20以上30未満の値)を返します。

    3. 識別番号に1を指定したRANDOMROWです。問合せ指定の結果の行ごとに同じ値(10以上20未満の値)を返します。

    4. 識別番号に2を指定したRANDOMROWです。問合せ指定の結果の行ごとに同じ値(0以上1未満の値)を返します。

  6. 次の内部導出表が展開された場合,内部導出表の導出問合せ中の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)

  7. 同じ識別番号のRANDOMROWを異なる問合せ指定に指定できます。ただし,それぞれのRANDOMROWの識別番号の種類は異なるものとして扱われます。

  8. SQL文中に指定できる識別番号の種類の数の上限は,1,000となります。ただし,SQL文中にビュー表を指定している場合は,そのビュー表が導出表に等価変換されたあとに,識別番号の種類の数がチェックされます。

  9. RANDOMCURSORRANDOMROWに同じ識別番号を指定できます。この場合,各スカラ関数は個別に生成した擬似乱数を返します。

    (例)

    SELECT RANDOMCURSOR(1,10,20) AS "C1",
           RANDOMROW(1,10,20) AS "C2"
        FROM "T1"

    実行結果の例

    [図データ]

  10. 実行結果のデータ型は,DOUBLE PRECISION型になります。

  11. 実行結果の値は,非ナル値制約なし(ナル値を許す)となります。

  12. 最小値または最大値がナル値の場合,実行結果もナル値になります。

  13. 最小値最大値をそれぞれDOUBLE PRECISION型に変換したあとで,実行結果を計算します。

  14. 最小値に指定した値Aと,最大値に指定した値Bの関係が,「AB」を満たす場合,自動的に最小値最大値を入れ替えます。そして,「B以上A未満」の範囲での一様分布に従う擬似乱数を返します。

  15. 最小値最大値に同じ値を指定した場合,実行結果は最小値に指定した値になります。

  16. 実行結果のデータ型で実行結果を表現できない場合,オーバフローエラーになります。

  17. 最大値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

[図データ]