카테고리:

쿼리 구문

VALUES

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

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

구문

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

매개 변수

expr

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

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

table_alias

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

column_alias

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

사용법 노트

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

  • VALUES 절에 동일한 열에 대한 여러 숫자 값이 포함되어 있고 값의 소수 자릿수 또는 전체 자릿수가 크게 다른 경우 Snowflake는 out of range 오류를 반환할 수 있습니다. 각 개별 값으로 인해 대상 열의 데이터 타입에 대한 오류가 발생하지 않더라도 이 오류가 반환될 수 있습니다.

    이 오류가 발생하는 이유는 Snowflake에서 VALUES 절에 제공되는 모든 숫자 리터럴을 포함할 수 있는 공통의 숫자 데이터 타입을 결정하며 일부 값이 결정된 공통 데이터 타입의 범위를 벗어날 수 있기 때문입니다.

    예를 들어, 다음 문은 out of range 오류를 반환합니다.

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

    다음과 같이 변경하면 이러한 타입의 오류를 방지할 수 있습니다.

    • VALUES 절의 값을 여러 SQL 문으로 구분합니다.

    • 값의 범위가 더 넓은 데이터 타입(예: FLOAT)으로 값을 캐스팅합니다. 그러나 캐스팅하면 전체 자릿수가 줄어들 수 있습니다.

    • 값을 따옴표로 묶인 텍스트 문자열로 지정한 다음, 필요에 따라 값을 숫자 값으로 변환합니다.

  • VALUES 절은 16,384행으로 제한됩니다.

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

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

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

SELECT column1, $2 FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three'));
Copy
+---------+-------+
| 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;
Copy

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

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