카테고리:

쿼리 구문

VALUES

SELECT 문에서 FROM 절의 하위 절 VALUES를 사용하면 상수 세트를 지정하여 행의 유한 세트를 만들 수 있습니다.

INSERT 문의 VALUES 절에 대한 내용은 INSERT 문의 설명서를 참조하세요.

구문

SELECT ...
FROM ( VALUES ( <expr> [ , <expr> [ , ... ] ] ) [ , ( ... ) ] )
  [ [ AS ] <table_alias> [ ( <column_alias> [ , ... ] ) ] ]
[ ... ]

매개 변수

expr

각 식은 상수이거나, SQL 문을 컴파일하는 동안 상수로 평가할 수 있는 식이어야 합니다.

대부분의 간단한 산술 식 및 문자열 함수는 컴파일 시간에 평가할 수 있지만, 대부분의 다른 식은 평가할 수 없습니다.

table_alias

행 세트가 테이블인 것처럼 행 세트에 이름으로 지정할 수 있는 선택적 별칭입니다.

column_alias

선택적 열 별칭으로 열 이름을 지정할 수 있습니다.

사용법 노트

  • FROM 절 내부에서, VALUES 절은 DEFAULT 키워드를 포함할 수 없습니다. 이 제한은 DEFAULT 사용을 지원하는 INSERT 문의 VALUES 절과는 대조됩니다(예: INSERT INTO table VALUES (10, DEFAULT, 'Name') ...).

  • VALUES 절에 동일한 열에 대해 서로 다른 데이터 타입의 여러 값이 포함된 경우, Snowflake는 모든 값을 포함할 수 있는 공통 데이터 타입을 결정하고 각 값을 해당 공통 타입으로 암시적으로 변환합니다. 이러한 변환을 사용자가 인식하지 못하는 경우 예기치 않은 결과나 오류를 생성할 수 있습니다.

    예기치 않은 강제 변환을 방지하려면 명시적으로 각 값을 원하는 유형으로 CAST하고, 값을 여러 SQL 문으로 구별하거나 열의 모든 값이 동일한 유형을 공유하도록 합니다.

    숫자 예

    동일한 열의 숫자 값이 소수 자릿수나 전체 자릿수에서 크게 다를 경우 해당 값은 결정된 공통 숫자 유형에 맞지 않기 때문에 Snowflake는 out of range 오류를 반환할 수 있습니다.

    SELECT column1 FROM VALUES
      (3.469446951953614e-18),
      (115898.73);
    
    100039 (22003): Numeric value '115898.73' is out of range
    

    특히 숫자 값의 경우, 값을 따옴표로 묶인 텍스트 문자열로 지정한 후 필요에 따라 숫자 값으로 변환할 수도 있습니다.

    타임스탬프 예

    다른 유형의 타임스탬프 값이 동일한 열에 표시되면 Snowflake는 모든 값을 공통 타임스탬프 유형으로 변환합니다. 다음 예제에서는 TIMESTAMP_NTZ 값이 TIMESTAMP_LTZ로 강제 변환됩니다.

    SELECT $1 AS a, SYSTEM$TYPEOF(a) FROM VALUES
      (TO_TIMESTAMP_LTZ('2025-03-24 01:37:00 -0700')),
      (TO_TIMESTAMP_NTZ('2025-03-24 08:37:00'));
    
    +-------------------------------+------------------+
    | A                             | SYSTEM$TYPEOF(A) |
    |-------------------------------+------------------|
    | 2025-03-24 01:37:00.000 -0700 | TIMESTAMP_LTZ(9) |
    | 2025-03-24 08:37:00.000 -0700 | TIMESTAMP_LTZ(9) |
    +-------------------------------+------------------+
    
  • VALUES 절은 200,000개의 행으로 제한됩니다.

다음 예제에서는 VALUES 절을 사용하여 알려진 고정 행 세트를 생성합니다.

SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three'));
+---------+---------+
| COLUMN1 | COLUMN2 |
|---------+---------|
|       1 | one     |
|       2 | two     |
|       3 | three   |
+---------+---------+

열 이름(암시적) 또는 열 위치로 값을 참조할 수 있습니다. 다음 예제에서는 열 위치로 두 번째 열을 참조합니다.

SELECT column1, $2 FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three'));
+---------+-------+
| COLUMN1 | $2    |
|---------+-------|
|       1 | one   |
|       2 | two   |
|       3 | three |
+---------+-------+

다음 예제에서는 별칭을 사용하여 여러 VALUES 절을 구분합니다.

SELECT v1.$2, v2.$2
  FROM (VALUES (1, 'one'), (2, 'two')) AS v1
        INNER JOIN (VALUES (1, 'One'), (3, 'three')) AS v2
  WHERE v2.$1 = v1.$1;

다음 예제와 같이 열 이름의 별칭을 지정할 수도 있습니다.

SELECT c1, c2
  FROM (VALUES (1, 'one'), (2, 'two')) AS v1 (c1, c2);