논리 데이터 타입

논리 데이터 타입 (Logical data types)

이 주제는 Snowflake에서 지원하는 논리(logical) 데이터 타입을 설명해요. Snowflake가 지원하는 논리 데이터 타입은 BOOLEAN 하나예요. 이 페이지에서는 BOOLEAN 값의 의미, 다른 타입과의 변환 규칙, 그리고 변환 시 주의할 점을 예제와 함께 다뤄요.

출처: Snowflake SQL Reference

본문

이 주제는 Snowflake에서 지원하는 논리 데이터 타입에 대해 설명해요.

데이터 타입

Snowflake는 하나의 논리 데이터 타입(BOOLEAN)을 지원해요.

BOOLEAN

BOOLEAN은 TRUE 또는 FALSE 값을 가질 수 있어요. 또한 UNKNOWN 값을 가질 수 있는데, 이는 NULL로 표현돼요. BOOLEAN 컬럼은 SELECT 목록 같은 표현식과 WHERE 절 같은 술어(predicate)에서 사용할 수 있어요.

BOOLEAN 데이터 타입은 삼치 논리(Ternary logic)를 지원해요.

BOOLEAN 변환

Snowflake는 BOOLEAN으로의 변환과 BOOLEAN으로부터의 변환을 지원해요.

BOOLEAN으로 변환

비(非)BOOLEAN 값을 BOOLEAN 값으로 명시적 또는 암시적으로 변환할 수 있어요.

명시적 변환

TO_BOOLEAN 또는 CAST 함수를 사용해 특정 문자열숫자 값을 BOOLEAN 값으로 명시적으로 변환할 수 있어요.

문자열 변환:

  • TRUE로 변환되는 문자열: 'true', 't', 'yes', 'y', 'on', '1'
  • FALSE로 변환되는 문자열: 'false', 'f', 'no', 'n', 'off', '0'
  • 변환은 대소문자를 구분하지 않아요.
  • 다른 문자열은 BOOLEAN 값으로 변환할 수 없어요.

숫자 변환:

  • 0(0)은 FALSE로 변환돼요.
  • 0이 아닌 값은 모두 TRUE로 변환돼요.
암시적 변환

Snowflake는 특정 문자열과 숫자 값을 BOOLEAN 값으로 암시적으로 변환할 수 있어요.

문자열 변환:

  • 'true'는 TRUE로 변환돼요.
  • 'false'는 FALSE로 변환돼요.
  • 변환은 대소문자를 구분하지 않아요.

숫자 변환:

  • 0(0)은 FALSE로 변환돼요.
  • 0이 아닌 값은 모두 TRUE로 변환돼요.

BOOLEAN으로부터 변환

BOOLEAN 값을 비BOOLEAN 값으로 명시적 또는 암시적으로 변환할 수 있어요.

명시적 변환

BOOLEAN 값을 문자열이나 숫자 값으로 명시적으로 캐스트할 수 있어요.

문자열 변환:

  • TRUE는 'true'로 변환돼요.
  • FALSE는 'false'로 변환돼요.

숫자 변환:

  • TRUE는 1로 변환돼요.
  • FALSE는 0으로 변환돼요.
암시적 변환

Snowflake는 BOOLEAN 값을 문자열 값으로 암시적으로 변환할 수 있어요.

문자열 변환:

  • TRUE는 'true'로 변환돼요.
  • FALSE는 'false'로 변환돼요.

Note

문자열로의 암시적 변환은 BOOLEAN 리터럴과 BOOLEAN 컬럼에서 동작해요. 그러나 계산된 BOOLEAN 표현식(예: (0 = 1) 같은 비교)은 연결 연산자(||)와 직접 사용할 때 암시적으로 변환되지 않아서, 쿼리가 오류를 반환해요. BOOLEAN 표현식의 결과를 연결하려면 TO_VARCHAR 또는 ::VARCHAR 연산자로 명시적으로 문자열로 캐스트해야 해요.

예제

테이블을 만들고 값을 삽입해요:

CREATE OR REPLACE TABLE test_boolean(
  b BOOLEAN,
  n NUMBER,
  s STRING);

INSERT INTO test_boolean VALUES
  (true, 1, 'yes'),
  (false, 0, 'no'),
  (NULL, NULL, NULL);

SELECT * FROM test_boolean;

+-------+------+------+
| B     |    N | S    |
|-------+------+------|
| True  |    1 | yes  |
| False |    0 | no   |
| NULL  | NULL | NULL |
+-------+------+------+

다음 쿼리는 BOOLEAN 타입의 표현식을 포함해요:

SELECT b, n, NOT b AND (n < 1) FROM test_boolean;

+-------+------+-------------------+
| B     |    N | NOT B AND (N < 1) |
|-------+------+-------------------|
| True  |    1 | False             |
| False |    0 | True              |
| NULL  | NULL | NULL              |
+-------+------+-------------------+

다음 예제는 술어에서 BOOLEAN 컬럼을 사용해요:

SELECT * FROM test_boolean WHERE NOT b AND (n < 1);

+-------+---+----+
| B     | N | S  |
|-------+---+----|
| False | 0 | no |
+-------+---+----+

다음 예제는 텍스트 값을 BOOLEAN 값으로 캐스트해요. SYSTEM$TYPEOF 함수로 변환 후 값의 타입을 확인해요.

SELECT s,
       TO_BOOLEAN(s),
       SYSTEM$TYPEOF(TO_BOOLEAN(s))
  FROM test_boolean;

+------+---------------+------------------------------+
| S    | TO_BOOLEAN(S) | SYSTEM$TYPEOF(TO_BOOLEAN(S)) |
|------+---------------+------------------------------|
| yes  | True          | BOOLEAN[SB1]                 |
| no   | False         | BOOLEAN[SB1]                 |
| NULL | NULL          | BOOLEAN[SB1]                 |
+------+---------------+------------------------------+

다음 예제는 숫자 값을 BOOLEAN 값으로 캐스트해요:

SELECT n,
       TO_BOOLEAN(n),
       SYSTEM$TYPEOF(TO_BOOLEAN(n))
  FROM test_boolean;

+------+---------------+------------------------------+
| N    | TO_BOOLEAN(N) | SYSTEM$TYPEOF(TO_BOOLEAN(N)) |
|------+---------------+------------------------------|
| 1    | True          | BOOLEAN[SB1]                 |
| 0    | False         | BOOLEAN[SB1]                 |
| NULL | NULL          | BOOLEAN[SB1]                 |
+------+---------------+------------------------------+

이 예제에서 Snowflake는 BOOLEAN 값을 텍스트 값으로 암시적으로 변환해요:

SELECT 'Text for ' || s || ' is ' || b AS result,
       SYSTEM$TYPEOF('Text for ' || s || ' is ' || b) AS type_of_result
  FROM test_boolean;

+----------------------+-------------------------+
| RESULT               | TYPE_OF_RESULT          |
|----------------------+-------------------------|
| Text for yes is true | VARCHAR(134217728)[LOB] |
| Text for no is false | VARCHAR(134217728)[LOB] |
| NULL                 | VARCHAR(134217728)[LOB] |
+----------------------+-------------------------+

계산된 BOOLEAN 표현식을 직접 연결하면, 표현식이 문자열로 암시적으로 변환되지 않기 때문에 오류가 반환돼요:

SELECT 'A' || (0 = 1);

001044 (42P13): SQL compilation error: error line 1 at position 25
Invalid argument types for function '||': (VARCHAR(1), BOOLEAN)

결과를 연결하려면 BOOLEAN 표현식을 문자열로 명시적으로 캐스트해요:

SELECT 'A' || TO_VARCHAR(0 = 1);

+--------------------------+
| 'A' || TO_VARCHAR(0 = 1) |
|--------------------------|
| Afalse                   |
+--------------------------+

더 알아보기 (Learn more)