CREATE TABLE DDL 문은 전환, 즉 달성된 목표에 대한 데이터를 포함하는 Goals 중첩 데이터 구조를 선언합니다.
visits 테이블의 각 행은 0개 이상의 전환에 해당할 수 있습니다.
flatten_nested 설정이 0으로 지정되면(flatten_nested=1이 기본값) 임의 수준의 중첩이 지원됩니다.
대부분의 경우 중첩 데이터 구조를 사용할 때는 점으로 구분된 컬럼 이름으로 컬럼을 지정합니다.
이 컬럼들은 같은 타입의 배열을 구성합니다.
하나의 중첩 데이터 구조에 속한 모든 컬럼 배열의 길이는 같습니다.
예시:
WHERE 절에서 Nested 컬럼 필터링
Nested 구조의 각 컬럼은 Array로 저장되므로, WHERE 절에서 이를 참조하면 각 행의 개별 요소가 아니라 전체 배열이 반환됩니다. 따라서 중첩된 컬럼을 스칼라 값과 직접 비교할 수 없으며, 대신 array functions을 사용해야 합니다.
예를 들어, 다음 쿼리는 아무 행도 반환하지 않은 채 조용히 넘어가는 것이 아니라 예외를 발생시킵니다. Goals.ID의 유형이 Array(UInt32)이고 equals(Array(UInt32), UInt32)는 유효한 비교가 아니기 때문입니다:
has를 사용합니다:
arrayExists를 사용하십시오:
length로 배열 길이를 기준으로 필터링하거나 notEmpty로 빈 배열을 제외할 수 있습니다:
ARRAY JOIN을 사용해 배열을 펼치십시오.
ARRAY JOIN 후에는 각 요소가 별도의 행이 되므로 WHERE 절이 스칼라 값에 적용됩니다.
자세한 내용은 ARRAY JOIN 절을 참조하십시오. 예시:
SELECT를 수행할 수는 없습니다. 여기에 포함된 개별 컬럼만 명시적으로 나열할 수 있습니다.
데이터 삽입
INSERT 쿼리에서는 중첩 데이터 구조의 모든 구성 컬럼 배열을 각각 따로 전달해야 합니다(마치 개별 컬럼 배열인 것처럼). 삽입 시 시스템은 이들의 길이가 모두 같은지 확인합니다.
각 중첩 서브컬럼은 점 표기법(Goals.ID, Goals.Serial, …)으로 컬럼 목록에 나열되며, 해당 값은 배열입니다:
DESCRIBE 쿼리에서도 중첩 데이터 구조의 컬럼은 같은 방식으로 각각 별도로 나열됩니다.
ALTER 제한 사항
ALTER 쿼리에는 다음과 같은 제한 사항이 있습니다.
서브컬럼 추가는 정상적으로 지원됩니다. 기존 Nested 구조에 새 서브컬럼을 추가할 수 있습니다.
- 중첩 구조 자체 전체의 이름을 바꿀 수 없습니다(예:
Goals를Conversions로 변경). - 서브컬럼을 다른 중첩 구조로 옮길 수 없습니다(예:
Goals.ID를OtherNested.ID로 이동). - 서브컬럼을 중첩 구조 밖으로 꺼내거나 중첩 구조 안으로 넣을 수 없습니다(예:
Goals.ID를GoalID로 변경하거나 그 반대).