본문 바로가기
데이터베이스/Postgresql

[PostgreSQL] random 데이터 생성

by cbwstar 2021. 9. 10.
728x90
반응형

/* postgresql random 데이터 생성 */

SELECT LPAD(COALESCE(trunc(random() * 100000000 + 1)::text,'0'),8,'0')

  FROM generate_series(1,100)

     

PGSQL에서 SELECT random(); 사용하면 0.0 <= x < 1.0 범위의 난수를 반환해주는데, random()을 이용하여 특정 범위의 정수 값을 램덤하게 추출하는 방법을 소개합니다.

 

random()은 난수를 반환하기 때문에 trunc()를 이용하여 정수로 바꾸고, generate_series()를 이용하여 1백만번의 반복 실행으로 최소값과 최대값을 확인하여 지정한 범위대로 실행이되는지 확인해보겠습니다.

 

0 ~ 10 사이의 정수

trunc() 제거하면 0.0 <= x < 11.0 범위의 난수가 반환됩니다.

-- 0 <= x < 10 범위의 정수
-- "SELECT trunc(random() * 11);" 1백만번의 실행 시 최소값과 최대값 확인하기

-- Query
SELECT min(random), max(random) FROM (
    SELECT trunc(random() * 11) AS random FROM generate_series(1,1000000)
) AS test;

-- Result
 min | max
-----+-----
   0 |  10

1 ~ 10 사이의 정수

trunc() 제거하면 1.0 <= x < 11.0 범위의 난수가 반환됩니다.

-- 1 <= x < 11 범위의 정수
-- "SELECT trunc(random() * 10 + 1);" 1백만번의 실행 시 최소값과 최대값 확인하기

-- Query
SELECT min(random), max(random) FROM (
    SELECT trunc(random() * 10 + 1) AS random FROM generate_series(1,1000000)
) AS test;

-- Result
 min | max
-----+-----
   1 |  10

5 ~ 10 사이의 정수

trunc() 제거하면 5.0 <= x < 11.0 범위의 난수가 반환됩니다.

-- 5 <= x < 11 범위의 정수
-- "SELECT trunc(random() * (11-5) + 5);" 1백만번의 실행 시 최소값과 최대값 확인하기

-- Query
SELECT min(random), max(random) FROM (
    SELECT trunc(random() * (11-5) + 5) AS random FROM generate_series(1,1000000)
) AS test;

-- Result
 min | max
-----+-----
   5 |  10

함수 생성 후 사용하기

위 예제에서는 원하는 최대값에 +1된 값을 사용했는데, 아래 예제는 함수내에서 +1 처리하여 함수를 사용하는 곳에서 직관적으로 확인 가능하도록 만들었습니다.

-- DROP FUNCTION custom_random(start_number integer, end_number integer);
CREATE OR REPLACE FUNCTION custom_random(start_number integer, end_number integer)
RETURNS integer
LANGUAGE plpgsql
STRICT
AS $BODY$
    BEGIN
        RETURN trunc(random() * ((end_number + 1) - start_number) + start_number);
    END;
$BODY$;

생성한 custom_random() 사용하기

-- 5 <= x < 11 범위의 정수
-- "SELECT custom_random(5, 10);" 1백만번의 실행 시 최소값과 최대값 확인하기

-- Query
SELECT min(random), max(random) FROM (
    SELECT custom_random(5, 10) AS random FROM generate_series(1,1000000)
) AS test;

-- Result
 min | max
-----+-----
   5 |  10

728x90
반응형

댓글



"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

loading