전개 연산자
전개 연산자 (Expansion operators)
이 문서는 목록을 나타내는 쿼리 표현식을 목록 안의 개별 값들로 펼치는 전개 연산자에 대해 설명해요. 현재 Snowflake가 지원하는 유일한 전개 연산자는 스프레드 연산자(**)예요.
본문
전개 연산자는 목록을 나타내는 쿼리 표현식을 목록 안의 개별 값들로 펼쳐요. 현재 Snowflake가 지원하는 유일한 전개 연산자는 스프레드 연산자(**)예요.
스프레드 (Spread)
스프레드 연산자는 배열을 개별 값의 목록으로 펼쳐요. 이 연산자는 다음 사용 사례에 유용해요:
- IN 절을 포함하는 쿼리
- 값 목록을 인자로 받는 시스템 정의 함수 호출 — COALESCE, GREATEST, LEAST 같은 함수
- 인자를 사용해 값 배열을 제공하는 SQL 사용자 정의 함수
- 바인드 변수를 사용해 값 배열을 제공하는 Snowflake Scripting 저장 프로시저. Snowflake Scripting에서 바인드 변수 사용에 대한 자세한 내용은 "SQL 문에서 변수 사용(binding)"과 "SQL 문에서 인자 사용(binding)"을 참고하세요.
이 사용 사례에 대한 자세한 내용은 "Snowflake Introduces SQL Spread Operator (**)" 블로그 게시물을 참고하세요.
문법 (Syntax)
** <array>
제약 사항 (Limitations)
- 입력은 상수 값의 배열이어야 해요. 리터럴 값의 배열이거나 리터럴 값의 배열을 나타내는 바인드 변수일 수 있어요.
- 반정형 배열의 각 값은 VARIANT 타입이에요. VARIANT 값은 다른 어떤 데이터 타입의 값도 담을 수 있어요. 스프레드 연산자는 VARIANT 값에 저장된 값에 대해 다음 데이터 타입을 지원해요:
- Numeric (예: INTEGER, NUMERIC)
- String & binary (예: VARCHAR, BINARY)
- Logical (예: BOOLEAN)
- Date & time (예: DATE, TIME, TIMESTAMP)
- SQL이 아닌 다른 언어로 작성된 사용자 정의 함수와 저장 프로시저는 스프레드 연산자를 사용할 수 없어요.
- 매우 큰 배열을 스프레드 연산자로 펼치면 성능이 저하될 수 있어요.
예시 (Examples)
일부 예시는 다음 표의 데이터를 사용해요.
테이블을 만들고 데이터를 삽입해 봐요:
CREATE OR REPLACE TABLE spread_demo (col1 INT, col2 VARCHAR);
INSERT INTO spread_demo VALUES
(1, 'a'),
(2, 'b'),
(3, 'c'),
(4, 'd'),
(5, 'e');
SELECT * FROM spread_demo;
+------+------+
| COL1 | COL2 |
|------+------|
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
| 5 | e |
+------+------+
다음 예시들은 스프레드 연산자를 사용해요.
IN 절에서 리터럴 값 배열 펼치기
앞서 만든 spread_demo 테이블을 쿼리할 때 스프레드 연산자로 숫자 배열을 펼쳐 봐요:
SELECT * FROM spread_demo
WHERE col1 IN (** [3, 4])
ORDER BY col1;
+------+------+
| COL1 | COL2 |
|------+------|
| 3 | c |
| 4 | d |
+------+------+
스프레드 연산자로 문자열 배열을 펼쳐 봐요:
SELECT * FROM spread_demo
WHERE col2 IN (** ['b', 'd'])
ORDER BY col1;
+------+------+
| COL1 | COL2 |
|------+------|
| 2 | b |
| 4 | d |
+------+------+
INTEGER 값과 펼쳐진 배열 값을 섞어 IN 절을 사용해 봐요:
SELECT * FROM spread_demo
WHERE col1 IN (** [1, 2], 4, 5)
ORDER BY col1;
+------+------+
| COL1 | COL2 |
|------+------|
| 1 | a |
| 2 | b |
| 4 | d |
| 5 | e |
+------+------+
시스템 정의 함수 호출에서 리터럴 값 배열 펼치기
COALESCE 함수 호출에서 문자열 배열을 펼쳐 봐요:
SELECT COALESCE(** [NULL, NULL, 'my_string_1', 'my_string_2']) AS first_non_null;
+----------------+
| FIRST_NON_NULL |
|----------------|
| my_string_1 |
+----------------+
GREATEST 함수 호출에서 숫자 배열을 펼쳐 봐요:
SELECT GREATEST(** [1, 2, 5, 4, 5]) AS greatest_value;
+----------------+
| GREATEST_VALUE |
|----------------|
| 5 |
+----------------+
SQL 사용자 정의 함수에서 바인드 변수와 함께 스프레드 연산자 사용하기
스프레드 연산자를 사용하는 SQL 사용자 정의 함수를 만들어 봐요. 함수는 배열을 인자로 받은 뒤 배열 값을 펼쳐서 앞서 만든 spread_demo 테이블을 쿼리해요:
CREATE OR REPLACE FUNCTION spread_function_demo(col_1_values ARRAY)
RETURNS TABLE(
col1 INT,
col2 VARCHAR)
AS
$$
SELECT * FROM spread_demo
WHERE col1 IN (** col_1_values)
ORDER BY col1
$$;
이 함수를 사용해서 테이블을 쿼리해 봐요:
SELECT * FROM TABLE(spread_function_demo([1, 3, 5]));
+------+------+
| COL1 | COL2 |
|------+------|
| 1 | a |
| 3 | c |
| 5 | e |
+------+------+
Snowflake Scripting 저장 프로시저에서 바인드 변수와 함께 스프레드 연산자 사용하기
스프레드 연산자를 사용하는 Snowflake Scripting 저장 프로시저를 만들어 봐요. 저장 프로시저는 배열을 인자로 받은 뒤 바인드 변수의 배열 값을 펼쳐서 앞서 만든 spread_demo 테이블을 쿼리해요:
CREATE OR REPLACE PROCEDURE spread_sp_demo(col_1_values ARRAY)
RETURNS TABLE(
col1 INT,
col2 VARCHAR)
LANGUAGE SQL
AS
$$
DECLARE
res RESULTSET;
BEGIN
res := (SELECT * FROM spread_demo
WHERE col1 IN (** :col_1_values)
ORDER BY col1);
RETURN TABLE(res);
END;
$$;
저장 프로시저를 호출해 봐요:
CALL spread_sp_demo([2, 4]);
+------+------+
| COL1 | COL2 |
|------+------|
| 2 | b |
| 4 | d |
+------+------+