Hitachi

Hitachi Advanced Data Binder SQLリファレンス


8.4.6 RANDOMCURSOR

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

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

    • 問合せ指定の選択式

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

  2. 同じ識別番号を指定した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"
  3. 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. 識別番号に1を指定したRANDOMCURSORです。それぞれの関数は,常に同じ値(10以上20未満の値)を返します。

    2. 識別番号に2を指定したRANDOMCURSORです。それぞれの関数は,常に同じ値(20以上30未満の値)を返します。

  4. 次に示す識別番号が重複した場合,重複した識別番号を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が自動的に変更します。

  5. 1SQL文中に指定できるRANDOMCURSORの識別番号の種類の上限は,1,000となります。SQL文中にビュー表を指定している場合,CREATE VIEW文に指定したRANDOMCURSORの識別番号の種類の数も加算されて合計した数の上限が1,000となります。

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

    (例)

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

    実行結果の例

    [図データ]

  7. カーソルオープン時に擬似乱数が生成されるため,カーソルオープンのたびにRANDOMCURSORの結果が変わります。

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

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

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

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

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

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

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

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

実行結果の例

[図データ]