비교
비교 (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함수로 매크로를 만들거나 사용자 정의 함수를 구현하는 것을 고려해요.
BETWEEN 및 IS [NOT] NULL
표준 비교 연산자 외에도 BETWEEN과 IS (NOT) NULL 연산자가 있어요. 이들은 연산자처럼 동작하지만 SQL 표준이 요구하는 특수 문법을 가져요. 아래 표에 나와 있어요.
BETWEEN과 NOT 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 규칙을 살펴볼 수 있어요.