개발/Oracle

오라클(Oracle) DBMS_RANDOM 랜덤 정렬(order by) 로또 번호 생성 추출 쿼리

TaeDy.I.T. 2023. 3. 5. 06:10
반응형

안녕하세요. 오늘은 오라클(Oracle) DBMS_RANDOM에 대해 알아보고 응용해서 로또 번호 생성 추출 쿼리까지 알아보겠습니다.
 

오라클(Oracle) DBMS_RANDOM
오라클(Oracle) DBMS_RANDOM

 

DBMS_RANDOM란?

- 숫자와 문자 데이터를 랜덤하게 생성하여 리턴해주는 패키지 입니다.
 

DBMS_RANDOM 종류

1. DBMS_RANDOM.VALUE
- 랜덤한 숫자를 생성하여 리턴해줍니다.
- DBMS_RANDOM.VALUE(min, max) min: 최소값, max: 최대값
 
2. DBMS_RANDOM.STRING
- 랜던한 문자열을 생성하여 리턴해줍니다.
- DBMS_RANDOM.STRING('옵션', '문자열길이')

옵션 종류 옵션 설명
'l' or 'L' 소문자만 리턴
'u' or 'U' 대문자만 리턴
'x' or 'X' 영문자와 숫자혼합하여 리턴
'a' or 'A' 대문자와 소문자 구분없이 리턴
'p' or 'P' 문자와 혼합하여 리턴

 
3. DBMS_RANDOM.RANDOM
- 랜덤한 숫자를 생성하여 리턴해줍니다.
- DBMS_RANDOM.RANDOM()
- 데이터를 랜덤하게 정렬이 가능합니다.
 

DBMS_RANDOM 랜덤 정렬 예시
WITH TEMP_USER AS (
    SELECT 1 AS SEQ, 'a' AS ID, '홍길동' AS NAME, 32 AS AGE, 1 AS SEX_CD FROM DUAL UNION ALL
    SELECT 2 AS SEQ, 'b', '홍길순', 62, 2  FROM DUAL UNION ALL
    SELECT 3 AS SEQ, 'c', '김철수', 52, 1  FROM DUAL UNION ALL
    SELECT 4 AS SEQ, 'd', '김영희', 45, 2  FROM DUAL UNION ALL
    SELECT 5 AS SEQ, 'e', '강철진', 17, 1  FROM DUAL UNION ALL
    SELECT 6 AS SEQ, 'f', '권용태', 26, 1  FROM DUAL UNION ALL
    SELECT 7 AS SEQ, 'g', '김지은', 24, 2  FROM DUAL UNION ALL
    SELECT 8 AS SEQ, 'h', '서석대', 28, 1  FROM DUAL UNION ALL
    SELECT 9 AS SEQ, 'i', '김진민', 18, 2  FROM DUAL UNION ALL
    SELECT 10 AS SEQ, 'j', '나호철', 9, 0  FROM DUAL
)
SELECT SEQ
	 , ID
	 , NAME
	 , AGE
	 , SEX_CD
	 ,  CASE WHEN SEX_CD = '1' THEN '남자'
		     WHEN SEX_CD = '2' THEN '여자'
		     ELSE '성별 판독 불가' 
		 END AS SEX_NM
     FROM TEMP_USER
     ORDER BY DBMS_RANDOM.RANDOM();
DBMS_RANDOM 랜덤 정렬
DBMS_RANDOM 랜덤 정렬 결과

ORDER BY에 DBMS_RANDOM.RANDOM()를 사용하여 랜덤하게 정렬된 결과를 볼수있습니다.
아주 간단합니다.
 

DBMS_RANDOM 로또 번호 생성
SELECT MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 1, num)) no1,
       MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 2, num)) no2,
       MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 3, num)) no3,
       MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 4, num)) no4,
       MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 5, num)) no5,
       MIN(DECODE(MOD(ROWNUM - 1, 6) + 1, 6, num)) no6
FROM (
        SELECT grp, num
        FROM (
            SELECT grp, num, MOD(ROWNUM - 1, 45) + 1 rnum
            FROM (
                SELECT CEIL(LEVEL / 45) grp, MOD(LEVEL - 1, 45) + 1 num
                FROM DUAL
                CONNECT BY LEVEL <= 45
                ORDER BY 1, DBMS_RANDOM.VALUE
            )
        )
        WHERE rnum <= 6
        ORDER BY grp, num
    )
GROUP BY grp;

결과는 생략하겠습니다.
재미로 돌려 보시고 추출된 번호로 로또를 사보는것도 어떨까 생각됩니다.
 
 
이상 오라클(Oracle) DBMS_RANDOM에 대해 알아보고 응용해서 로또 번호 생성 추출 쿼리에 대해 알아보았습니다.

반응형