비교

비교 (Comparisons)

DuckDB의 비교 연산자와 BETWEEN, IS [NOT] NULL 연산자를 살펴볼게요. NULL 값이 어떻게 다뤄지는지도 잘 이해하는 것이 중요해요.

출처: 문서

본문

비교 연산자

아래 표는 표준 비교 연산자를 보여줘요. 두 입력 인자 중 하나라도 NULL이면 비교의 출력은 NULL이에요.

연산자 설명 예제 결과
< 보다 작음 2 < 3 true
> 보다 큼 2 > 3 false
<= 보다 작거나 같음 2 <= 3 true
>= 보다 크거나 같음 4 >= NULL NULL
= 또는 == 같음 NULL = NULL NULL
<> 또는 != 같지 않음 2 <> 2 false

아래 표는 표준 구분 연산자를 보여줘요. 이 연산자들은 NULL 값을 동일한 것으로 취급해요.

연산자 설명 예제 결과
IS DISTINCT FROM 같지 않음, NULL 포함 2 IS DISTINCT FROM NULL true
IS NOT DISTINCT FROM 같음, NULL 포함 NULL IS NOT DISTINCT FROM NULL true

조합 Casting

서로 다른 타입에서 비교를 수행할 때 DuckDB는 Combination Casting을 수행해요. 이 cast들은 대화형 쿼리를 더 편리하게 만들기 위해 도입됐으며 여러 프로그래밍 언어가 수행하는 cast들과 일치하지만, 종종 PostgreSQL의 동작과는 호환되지 않아요. 예를 들어 다음 표현식은 DuckDB에서 평가·반환되어 true이지만 PostgreSQL에서는 실패해요.

SELECT 1 = true;
SELECT 1 = '1.1';

DuckDB의 비교 연산자에 대해 더 엄격한 타입 검사를 강제하는 것은 불가능해요. 더 엄격한 타입 검사가 필요하다면 typeof 함수매크로를 만들거나 사용자 정의 함수를 구현하는 것을 고려해요.

BETWEENIS [NOT] NULL

표준 비교 연산자 외에도 BETWEENIS (NOT) NULL 연산자가 있어요. 이들은 연산자처럼 동작하지만 SQL 표준이 요구하는 특수 문법을 가져요. 아래 표에 나와 있어요.

BETWEENNOT BETWEEN은 모든 입력을 같은 타입으로 cast하기 때문에, a, x, y가 모두 같은 타입인 경우에만 아래 예제와 동일하다는 점에 주의해요.

술어 설명
a BETWEEN x AND y x <= a AND a <= y와 동일
a NOT BETWEEN x AND y x > a OR a > y와 동일
expression IS NULL 표현식이 NULL이면 true, 그렇지 않으면 false
expression ISNULL IS NULL의 별칭 (비표준)
expression IS NOT NULL 표현식이 NULL이면 false, 그렇지 않으면 true
expression NOTNULL IS NOT NULL의 별칭 (비표준)

BETWEEN의 어떤 입력에 대한 명시적 collation은 전체 BETWEEN 표현식에 적용돼요. 이는 비교를 따로 작성하는 것과 다를 수 있어요. 비교를 따로 작성하면 명시적 collation은 그것을 포함하는 비교에만 적용되기 때문이에요.

SELECT
    'B' NOT BETWEEN ('A' COLLATE NOCASE) AND 'a' AS between_result,
    'B' < ('A' COLLATE NOCASE) OR 'B' > 'a' AS separate_result;
between_result separate_result
true false

표현식 BETWEEN x AND y에서 x는 하한, y는 상한으로 사용돼요. 따라서 x > y이면 결과는 항상 false예요.

더 알아보기 (Learn more)

  • Collations 문서에서 텍스트 비교 규칙을 확인해요.
  • Typecasting 문서에서 조합 cast 규칙을 살펴볼 수 있어요.