본문 바로가기

DB/Oracle

DB에서 컬럼 순서 랜덤하게 가져오기

일을 하다가 컬럼 순서를 랜덤하게 가져와야할 필요가 있어서 찾아보았다. DBMS_RANDOM을 이용하여 난수를 발생하여 가져올 수 있다. 방법은 몇가지 있다.

SELECT DBMS_RANDOM.VALUE(1, 1000) AS RND FROM DUAL;


 위 쿼리는 1~1000 사이의 값을 가져오는데, 소숫점의 숫자도 포함되어 있다. 정수만 가져오려면 소숫점을 없애주면 된다.

SELECT CEIL(DBMS_RANDOM.VALUE(1, 1000)) AS RND FROM DUAL

CONNECT BY LEVEL <= 10;


10개는 난수를 가져올 것이다. 한가지 방법이 더 있다. 다음은 정수형 난수를 발생기키는 쿼리이다. 음수부터 양수까지 나온다.

SELECT DBMS_RANDOM.RANDOM AS RND FROM DUAL

CONNECT BY LEVEL <= 10;


이 쿼리를 약간 수정해서 위에 쿼리와 같은 기능으로 만들어보자

SELECT MOD(ABS(DBMS_RANDOM.RANDOM), 1000)+1 AS RND FROM DUAL

CONNECT BY LEVEL <= 10;


ABS를 이용해 양수만 가져온 후에, MOD로 나머지 연산을 하면 되겠다. 여기까지는 프로그래머라면 쉽게 구할 것이다.


그런데, 쿼리를 조금 복잡하게 짜다보니 버그인지 모르겠지만 문제가 발생했다. 실제로 사용하는 테이블에 RND를 컬럼으로 추가해서 RND 기준으로 정렬하고 SELECT로 몇번 감쌌더니 COUNT(*)에서 0으로 출력된다. *로 보면 데이터가 나온다. 조금 검색해봤으나 사례를 찾지 못하여 시간 관계상 문제가 생길 것같아 다른 방법을 찾아보았다.

SELECT LEVEL FROM DUAL

ORDER BY DBMS_RANDOM.RANDOM();


위와 같이 하면 컬럼 순서가 계속 바뀌는 것을 볼 수 있다.


- 출처 -

http://www.gurubee.net/lecture/1400

'DB > Oracle' 카테고리의 다른 글

like in 해보자. regexp_like  (0) 2016.08.17
모르는 테이블 조회  (0) 2016.07.20
오라클 포트 설정하기  (0) 2014.05.21
한글 - 알파벳 - 숫자 순으로 정렬  (0) 2013.07.29
D-DAY 계산  (0) 2013.01.17