管理人Kのひとりごと

デジモノレビューやプログラミングや写真など

列をシャッフルするSQL

テストデータを作るときなど、列をシャッフルしたかったので考えたメモ。

やりたいこと

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