generate_series 테이블 값 함수
generate_series 테이블 값 함수
generate_series(START, STOP, STEP)는 값들의 연속을 생성하는 테이블 값 함수예요. 이 함수는 SQLite 소스 트리에 포함된 로더블 확장(loadable extension)이며, 명령줄 셸에도 컴파일되어 있어요.
출처: 문서
본문
generate_series() 테이블은 "value"라는 이름의 보이는 결과 열을 하나 가지며, 정수 값을 담아요. 행의 수는 매개변수 START, STOP, STEP에 의해 결정돼요. 테이블의 첫 행 값은 START이고, 이후 행은 STEP만큼 증가하며 STOP을 넘지 않는 값까지 생성해요.
generate_series() 테이블에는 "start", "stop", "step"이라는 이름의 숨겨진 열도 추가로 있어요. 이 열들의 값은 제공되었거나 기본값으로 결정된 START, STOP, STEP의 실제 값이에요. 또한 보통의 이름으로 접근 가능한 rowid도 있어요.
생략된 매개변수는 기본값을 취해요. STEP의 기본값은 1이고, STOP의 기본값은 4294967295예요. START 매개변수는 버전 3.37.0(2021-11-27) 이후부터 필수이며, START를 생략하거나 자기 참조적이거나 계산 불가능한 값을 주면 오류가 발생해요. 이전 버전에서는 START의 기본값이 0이었어요. 이전 동작은 최근 코드에서 -DZERO_ARGUMENT_GENERATE_SERIES로 컴파일하면 얻을 수 있어요.
1.1. 동일한 재귀 공통 테이블 식
양수 STEP 값에 대해서는 재귀 공통 테이블 식을 이용해 generate_series 테이블을 흉내 낼 수 있어요. 세 매개변수가 $start, $end, $step이라면, 이에 해당하는 공통 테이블 식은 다음과 같아요.
WITH RECURSIVE generate_series(value) AS (
SELECT $start
UNION ALL
SELECT value+$step FROM generate_series
WHERE value+$step=$end
) ...
공통 테이블 식은 확장을 로드하지 않고도 동작해요. 반면에 확장은 프로그래밍하기 더 쉽고 더 빠르다는 장점이 있어요.
2. 사용 예시
100 이하의 5의 배수를 모두 생성해요.
SELECT value FROM generate_series(5,100,5);
20개의 무작위 정수 값을 생성해요.
SELECT random() FROM generate_series(1,20);
계좌 번호가 10000과 20000 사이의 100의 짝수 배수인 모든 고객의 이름을 찾아요.
SELECT customer.name
FROM customer, generate_series(10000,20000,100)
WHERE customer.id=value;
/* or */
SELECT name FROM customer
WHERE id IN (SELECT value
FROM generate_series(10000,20000,200));