SQL JSON 함수

SQL JSON 함수

Druid SQL에서 JSON 데이터를 추출·변환·생성할 때 쓰는 JSON 함수들을 소개해요. nested column과 함께 쓰면 JSON 구조를 효율적으로 다룰 수 있어요.

출처: 문서

본문

Druid는 중첩 데이터 구조를 위한 최적화된 저장과 인덱스를 제공하는 nested column을 지원해요. 자세한 내용은 Nested columns 문서를 참고해요.

다음 JSON 함수들을 사용해 COMPLEX<json> 객체를 추출·변환·생성할 수 있어요.

| Function | Notes | | JSON_KEYS(expr, path) | expr에서 지정된 path 위치의 필드 이름 배열을 반환해요. | | JSON_MERGE(expr1, expr2[, expr3 ...]) | 두 개 이상의 JSON STRING 또는 COMPLEX 값을 하나로 병합해요. 키가 겹치면 가장 오른쪽 값을 유지해요. 어떤 인자가 NULL이면 NULL을 반환해요. 항상 COMPLEX 객체를 반환해요. | | JSON_OBJECT(KEY expr1 VALUE expr2[, KEY expr3 VALUE expr4, ...]) | 하나 이상의 표현식으로 새 COMPLEX 객체를 만들어요. KEY 표현식은 string 타입으로 평가돼야 해요. VALUE 표현식은 다른 COMPLEX 객체를 포함한 어떤 입력 타입으로도 구성될 수 있어요. 콜론으로 구분된 키-값 쌍도 받을 수 있어요. 다음 구문도 동일해요: JSON_OBJECT(expr1:expr2[, expr3:expr4, ...]) . | | JSON_PATHS(expr) | expr에서 기본형(primitive) 값을 가리키는 모든 경로를 JSONPath 형식의 배열로 반환해요. | | JSON_QUERY(expr, path) | expr에서 지정된 path 위치의 COMPLEX 값을 추출해요. | | JSON_QUERY_ARRAY(expr, path) | expr에서 지정된 path 위치의 ARRAY<COMPLEX> 값을 추출해요. 값이 ARRAY가 아니면, path의 값을 담은 단일 요소 ARRAY로 변환해요. 주로 다른 array 함수의 입력으로 쓸 객체 배열을 추출할 때 사용해요. | | JSON_VALUE(expr, path [RETURNING sqlType]) | expr에서 지정된 path 위치의 기본형 값을 추출해요. RETURNING을 포함하고 SQL 타입(예: VARCHAR , BIGINT , DOUBLE )을 지정하면 제안된 타입으로 쿼리를 계획해요. RETURNING을 포함하지 않으면 문맥에 따라 타입을 추론하려고 해요. 타입을 추론할 수 없으면 VARCHAR로 기본 설정돼요. 기본형 배열도 반환할 수 있지만, RETURNING을 ARRAY 타입(예: RETURNING VARCHAR ARRAY )으로 지정한 경우에만 가능해요. | | PARSE_JSON(expr) | expr을 COMPLEX 객체로 파싱해요. 이 함수는 처리 과정에서 JSON 값을 역직렬화해서 문자열화된 JSON을 중첩 구조로 변환해요. 입력이 유효하지 않은 JSON이거나 VARCHAR가 아니면 오류를 반환해요. | | TRY_PARSE_JSON(expr) | expr을 COMPLEX 객체로 파싱해요. 이 연산자는 처리 과정에서 JSON 값을 역직렬화해서 문자열화된 JSON을 중첩 구조로 변환해요. 입력이 유효하지 않은 JSON이거나 VARCHAR가 아니면 NULL 값을 반환해요. | | TO_JSON_STRING(expr) | expr을 JSON 문자열로 직렬화해요. |

JSONPath 문법

Druid는 JSONPath 문법 연산자의 일부만 지원해요. 주로 중첩 데이터 구조에서 개별 값을 추출하는 데 한정돼요.

| Operator | Description | | $ | 루트 요소예요. 모든 JSONPath 표현식은 이 연산자로 시작해요. | | . | 점 표기법(dot notation)의 자식 요소예요. | | [''] | 대괄호 표기법(bracket notation)의 자식 요소예요. | | [] | 배열 인덱스예요. |

다음과 같은 예시 입력 JSON을 생각해 봐요:

{
"x":1, "y":[1, 2, 3]}
  • 전체 JSON 객체를 반환하려면: $ -> {"x":1, "y":[1, 2, 3]}
  • 키 "x"의 값을 반환하려면: $.x -> 1
  • 배열을 담은 키에서 전체 배열을 반환하려면: $['y'] -> [1, 2, 3]
  • 배열을 담은 키에서 배열의 항목을 반환하려면: $.y[1] -> 2

더 알아보기 (Learn more)