なんじゃくにっき

プログラミングの話題中心。

SQLで乱数表

Oracle10g以降限定だけど
16*16の乱数表を吐くSQLを書いてみた。

SELECT TO_CHAR(MAX(X) KEEP (DENSE_RANK FIRST ORDER BY Y), 'FM0X') "0",
       TO_CHAR(MAX(X) KEEP (DENSE_RANK FIRST ORDER BY MOD(Y+1,16)), 'FM0X') "1",
       TO_CHAR(MAX(X) KEEP (DENSE_RANK FIRST ORDER BY MOD(Y+2,16)), 'FM0X') "2",
       TO_CHAR(MAX(X) KEEP (DENSE_RANK FIRST ORDER BY MOD(Y+3,16)), 'FM0X') "3",
       TO_CHAR(MAX(X) KEEP (DENSE_RANK FIRST ORDER BY MOD(Y+4,16)), 'FM0X') "4",
       TO_CHAR(MAX(X) KEEP (DENSE_RANK FIRST ORDER BY MOD(Y+5,16)), 'FM0X') "5",
       TO_CHAR(MAX(X) KEEP (DENSE_RANK FIRST ORDER BY MOD(Y+6,16)), 'FM0X') "6",
       TO_CHAR(MAX(X) KEEP (DENSE_RANK FIRST ORDER BY MOD(Y+7,16)), 'FM0X') "7",
       TO_CHAR(MAX(X) KEEP (DENSE_RANK FIRST ORDER BY MOD(Y+8,16)), 'FM0X') "8",
       TO_CHAR(MAX(X) KEEP (DENSE_RANK FIRST ORDER BY MOD(Y+9,16)), 'FM0X') "9",
       TO_CHAR(MAX(X) KEEP (DENSE_RANK FIRST ORDER BY MOD(Y+10,16)), 'FM0X') "A",
       TO_CHAR(MAX(X) KEEP (DENSE_RANK FIRST ORDER BY MOD(Y+11,16)), 'FM0X') "B",
       TO_CHAR(MAX(X) KEEP (DENSE_RANK FIRST ORDER BY MOD(Y+12,16)), 'FM0X') "C",
       TO_CHAR(MAX(X) KEEP (DENSE_RANK FIRST ORDER BY MOD(Y+13,16)), 'FM0X') "D",
       TO_CHAR(MAX(X) KEEP (DENSE_RANK FIRST ORDER BY MOD(Y+14,16)), 'FM0X') "E",
       TO_CHAR(MAX(X) KEEP (DENSE_RANK FIRST ORDER BY MOD(Y+15,16)), 'FM0X') "F"
  FROM(SELECT Rownum-1 AS X,
              Row_number() OVER (ORDER BY dbms_random.random)-1 AS Y
         FROM DUAL
      CONNECT BY LEVEL <= 256)
 GROUP BY TRUNC(Y/16)

結果は以下の通り。

そのまま実行すると毎回違う表を出力。
毎回同じ値を出力したければdbms_randomパッケージで乱数の種を設定する必要あり。