일반 함수
적어도* 두 가지 유형의 함수가 있습니다. 일반 함수(보통 그냥 「함수」라고 부릅니다)와 집계 함수입니다. 이 둘은 완전히 다른 개념입니다. 일반 함수는 각 행에 개별적으로 적용되는 것처럼 동작합니다(각 행에 대한 함수의 결과는 다른 행들에 의존하지 않습니다). 집계 함수는 여러 행에서 나온 값들의 집합을 누적합니다(즉, 전체 행 집합에 의존합니다).
이 절에서는 일반 함수에 대해 설명합니다. 집계 함수에 대해서는 「집계 함수」 절을 참조하십시오.
강한 타입 지정
표준 SQL과 달리 ClickHouse는 강한 타입 지정을 사용합니다. 즉, 타입 간에 암시적 타입 변환을 수행하지 않습니다. 각 함수는 특정 타입 집합에 대해서만 동작합니다. 따라서 경우에 따라 타입 변환 함수(변환 함수)를 사용해야 합니다.
공통 부분식 제거(Common Subexpression Elimination)
쿼리에서 동일한 AST(동일한 레코드 또는 동일한 구문 분석 결과)를 가지는 모든 식은 동일한 값을 가지는 것으로 간주됩니다. 이러한 식은 하나로 묶여 한 번만 실행됩니다. 동일한 서브쿼리도 이와 같은 방식으로 제거됩니다.
결과 타입
모든 함수는 결과로 단일 값만 반환합니다(여러 개의 값이나 0개의 값은 반환하지 않습니다). 결과 타입은 일반적으로 인수의 값이 아니라 인수의 타입에 의해서만 결정됩니다. 예외는 tupleElement 함수(a.N 연산자)와 toFixedString 함수입니다.
상수
단순화를 위해 일부 함수는 특정 인자에 대해서는 상수에 대해서만 동작합니다. 예를 들어 LIKE 연산자의 오른쪽 인자는 반드시 상수여야 합니다. 거의 모든 함수는 상수 인자에 대해 상수를 반환합니다. 예외는 난수를 생성하는 함수입니다. 「now」 함수는 서로 다른 시점에 실행된 쿼리에 대해 서로 다른 값을 반환하지만, 그 결과는 상수로 간주됩니다. 상수 여부는 단일 쿼리 내에서만 중요하기 때문입니다. 상수 표현식 역시 상수로 간주됩니다(예: LIKE 연산자의 오른쪽 부분은 여러 상수로부터 구성할 수 있습니다).
함수는 상수 인자와 비상수 인자에 대해 서로 다른 방식으로 구현될 수 있습니다(서로 다른 코드가 실행됨). 그러나 상수 인자에 대한 결과와 동일한 값만 포함하는 실제 컬럼에 대한 결과는 서로 일치해야 합니다.
NULL 처리
함수는 다음과 같이 동작합니다:
- 함수의 인수 중 하나라도
NULL이면 함수의 결과도NULL입니다. - 각 함수의 설명에서 개별적으로 지정된 특수 동작이 있을 수 있습니다. ClickHouse 소스 코드에서는 이러한 함수에
UseDefaultImplementationForNulls=false가 지정되어 있습니다.
상수성
함수는 인수의 값을 변경하지 않으며, 값의 모든 변경은 반환 결과로만 나타납니다. 따라서 각 함수를 개별적으로 계산한 결과는 쿼리에서 함수가 어떤 순서로 작성되어 있는지에 영향을 받지 않습니다.
고차 함수
-> 연산자와 lambda(params, expr) 함수
고차 함수는 함수 인자로 람다 함수만 허용합니다. 람다 함수를 고차 함수에 전달하려면 -> 연산자를 사용합니다. 화살표 연산자의 왼쪽에는 형식 매개변수가 오며, 이는 하나의 ID이거나, 튜플 안에 있는 여러 개의 형식 매개변수(ID들)일 수 있습니다. 화살표 연산자의 오른쪽에는 이러한 형식 매개변수와 임의의 테이블 컬럼을 사용할 수 있는 표현식이 옵니다.
예시:
여러 개의 인수를 받는 람다 함수도 고차 함수에 전달할 수 있습니다. 이 경우 고차 함수에는 동일한 길이의 여러 배열이 전달되며, 각 인수가 각각의 배열과 대응합니다.
일부 함수에서는 첫 번째 인수(람다 함수)를 생략할 수 있습니다. 이 경우 항등 매핑이 이루어지는 것으로 간주합니다.
사용자 정의 함수(UDFs)
ClickHouse는 사용자 정의 함수(UDF)를 지원합니다. 자세한 내용은 UDFs를 참조하십시오.