/* 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
'데이터베이스 > Postgresql' 카테고리의 다른 글
테이블의 스키마와 owner 변경하기 (0) | 2021.09.29 |
---|---|
[PostgreSQL] 세션에 걸려있는 프로세스 강제종료 하기 (0) | 2021.09.29 |
[PostgreSQL] 시간 계산하기 (0) | 2021.09.09 |
[PostgreSQL] 트리거 생성 (0) | 2021.09.07 |
[PostgreSQL] 시간 데이터타입 쿼리/함수 (0) | 2021.08.07 |
댓글