전개 연산자

전개 연산자 (Expansion operators)

이 문서는 목록을 나타내는 쿼리 표현식을 목록 안의 개별 값들로 펼치는 전개 연산자에 대해 설명해요. 현재 Snowflake가 지원하는 유일한 전개 연산자는 스프레드 연산자(**)예요.

출처: Snowflake SQL Reference

본문

전개 연산자는 목록을 나타내는 쿼리 표현식을 목록 안의 개별 값들로 펼쳐요. 현재 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    |
+------+------+

더 알아보기 (Learn more)