테이블 리터럴

테이블 리터럴 (Table literals)

이 문서는 SQL 문의 FROM 절에서 테이블 이름 대신 사용하는 테이블 리터럴(Table literal)이 무엇인지, 그리고 TABLE() 함수 형태로 어떻게 쓰는지 설명해요. 문자열 리터럴, 세션 변수, 바인드 변수를 테이블 리터럴로 사용하는 방법과 각각의 주의사항을 다루어요.

출처: Snowflake SQL Reference

본문

테이블 리터럴은 테이블 이름이나 테이블 이름 대신 들어갈 플레이스홀더 값을 쿼리에 전달할 때 사용해요. 테이블 리터럴은 SQL 문의 FROM 절에 나타나며, 테이블 이름 자체이거나 테이블 이름 자리에 들어가는 SQL 변수나 API 바인드 변수로 구성돼요.

비공식적으로 TABLE(...)로 테이블 리터럴을 구성한다고 할 때, TABLE()을 테이블 함수처럼 생각할 수 있어요. 문법적으로 TABLE()은 함수처럼 보이지만, 의미상으로 테이블 함수와 비슷하게 동작해요:

  • 스칼라 값을 입력으로 받아요.
  • 0개 이상의 행 집합을 반환해요.
  • FROM 절에서 행의 소스로 사용될 수 있어요.

문법 (Syntax)

TABLE( { <string_literal> | <session_variable> | <bind_variable> } )

  • string_literal — 테이블에 대한 식별자를 포함하는 문자열 리터럴이에요:
    • 식별자는 db_name.schema_name.table_name 또는 schema_name.table_name 형태로 완전히 한정(fully-qualified)될 수 있어요.
    • 대소문자를 구분하거나 공백·특수문자를 포함하는 개별 객체 식별자는 큰따옴표로 감쌀 수 있어요.
    • 전체 식별자 문자열은 작은따옴표나 $$로 감싸야 해요. 예: 'mytable' 또는 $$mytable$$, 'mydb.myschema.mytable' 또는 $$mydb.myschema.mytable$$, '"DB 1"."Schema 1".mytable' 또는 $$"DB 1"."Schema 1".mytable$$
  • session_variable — 세션에 설정된 SQL 변수예요.
  • bind_variable? 또는 :name 표준 형태의 바인드 변수로, 바인딩을 지원하는 API(Java, Python 등)에서 사용해요.

사용 시 주의사항 (Usage notes)

  • 테이블 리터럴은 FROM 절에서만 지원돼요.
  • TABLE()이 지원되는 곳에서는 IDENTIFIER()를 사용하는 것과 동일해요.
  • 바인드 변수를 사용해 문을 준비(prepare)하면, 문을 준비한 후에는 테이블 메타데이터를 사용할 수 없어요.

예시 (Examples)

테이블 리터럴을 사용해서 mytable 테이블을 조회해 봐요 (다음 두 예시는 문법적으로 동일해요):

SELECT * FROM TABLE('mytable');

SELECT * FROM TABLE($$mytable$$);

데이터베이스 mydb의 스키마 myschema에 있는 mytable을 테이블 리터럴로 조회해 봐요 (다음 두 예시는 문법적으로 동일해요):

SELECT * FROM TABLE('mydb."myschema"."mytable"');

SELECT * FROM TABLE($$mydb."myschema"."mytable"$$);

테이블 이름을 참조하는 세션 변수를 설정한 뒤, 그 변수를 테이블 리터럴로 전달해서 조회해 봐요:

SET myvar = 'mytable';

SELECT * FROM TABLE($myvar);

테이블을 나타내는 바인딩으로 문을 준비해 봐요 (다음 두 예시는 문법적으로 동일해요):

SELECT * FROM TABLE(?);

SELECT * FROM TABLE(:binding);

더 알아보기 (Learn more)