テストデータを作るときなど、列をシャッフルしたかったので考えたメモ。
やりたいこと
SQL> select * from dept; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON
これを
DEPTNO DNAME LOC ---------- -------------- ------------- 10 OPERATIONS NEW YORK 20 RESEARCH CHICAGO 30 SALES DALLAS 40 ACCOUNTING BOSTON
てな感じで、列内でシャッフルすることで匿名化したいということです。
SQL例
泥臭い方法ですが、各列をシャッフルして、結合することで対応してみました。カラムが増えると長くなってアレですね。
select t1.deptno ,t2.dname ,t3.loc from (select ROW_NUMBER() over(order by dbms_random.random) as row_number ,deptno from dept) t1 inner join (select ROW_NUMBER() over(order by dbms_random.random) as row_number ,dname from dept) t2 on t1.row_number = t2.row_number inner join (select ROW_NUMBER() over(order by dbms_random.random) as row_number ,loc from dept) t3 on t1.row_number = t3.row_number order by deptno ;
使用例
DEPTNO DNAME LOC ---------- -------------- ------------- 10 OPERATIONS BOSTON 20 RESEARCH CHICAGO 30 ACCOUNTING NEW YORK 40 SALES DALLAS