[SQLite] JSON
SQLite는 JSON을 일반 텍스트로 저장합니다. 여러 가지 JSON 함수들을 이용해, JSON 데이터를 다룰 수 있습니다.
json
json(X)
함수는 인수 X
가 유효한 JSON 문자열 또는 JSONB blob인지 확인하고 불필요한 공백을 모두 제거한 해당 JSON 문자열의 축소된 버전을 반환합니다.
json(' { "this" : "is", "a": [ "test" ] } ') → '{"this":"is","a":["test"]}'
jsonb
버전 3.45.0(2024-01-15)부터 SQLite에서는 JSON의 내부 "구문 분석 트리" 표현을 "JSONB"라는 형식의 BLOB로 디스크에 저장할 수 있습니다. JSON에 대한 SQLite의 내부 이진 표현을 데이터베이스에 직접 저장함으로써 애플리케이션은 JSON 값을 읽고 업데이트할 때 JSON을 구문 분석하고 렌더링하는 오버헤드를 우회할 수 있습니다. 내부 JSONB 형식도 텍스트 JSON보다 약간 적은 디스크 공간을 사용합니다.
텍스트 JSON을 입력으로 허용하는 모든 SQL 함수 매개변수는 JSONB 형식의 BLOB도 허용합니다. 이 함수는 두 경우 모두 동일하게 작동합니다. 단, 입력이 JSONB일 때 JSON 구문 분석기를 실행할 필요가 없기 때문에 더 빠르게 실행된다는 점이 다릅니다.
"JSONB"라는 이름은 PostgreSQL에서 따왔지만 두 DBMS의 JSONB 형식은 호환되지 않습니다. JSONB는 SQLite의 내부용 포맷이므로, SQLite 외부에서 JSONB를 사용하는 것은 권장되지 않습니다.
jsonb(X)
함수는 인수 X
로 제공된 JSON의 이진 JSONB 표현을 반환합니다
json_array
json_array
함수는 인자를 JSON 배열을 반환합니다.
json_array(1,2,'3',4) → '[1,2,"3",4]'
jsonb_array
함수는 인자를 JSONB 배열을 반환합니다.
json_array_length
json_array_length
함수는 JSON 배열의 길이를 반환합니다.
json_array_length('[1,2,3,4]') → 4
json_error_position
json_error_positionf(X)
함수는 입력 X
가 올바른 형식의 JSON인 경우 0을 반환합니다.
입력 X
에 하나 이상의 구문 오류가 포함된 경우 이 함수는 첫 번째 구문 오류의 문자 위치를 반환합니다.
json_extract
json_extract
함수는 JSON에서 하나 이상의 값을 추출하고 반환합니다.
json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.x', '$.c.f') → '[null ,7]'
jsonb_extract
함수는 JSONB를 반환합니다.
->
연산자는 json_extract
함수와 비슷한 기능을 합니다.
'{"a":2,"c":[4,5,{"f":7}]}' -> '$.c.f' → '7'
->>
연산자는 결과값을 SQL의 TEXT
, INTEGER
, REAL
또는 NULL
로 반환합니다.
'{"a":2,"c":[4,5,{"f":7}]}' -> '$.c.f' → 7
json_insert
json_insert
함수는 JSON 객체에 새로운 값을 삽입합니다.
json_insert('[1,2,3,4]','$[#]',99) → '[1,2,3,4,99]'
#
은 배열 끝 위치를 나타냅니다.
jsonb_insert
함수는 JSONB를 반환합니다.
json_replace
json_replace
와 JSON 객체의 값을 변경합니다.
json_replace('{"a":2,"c":4}', '$.a', 99) → '{"a":99,"c":4}'
jsonb_replace
함수는 JSONB를 반환합니다.
json_set
json_set
함수는 JSON 객체의 값을 설정합니다. 만약 기존에 존재하면 변경합니다.
json_set('{"a":2}', '$.c', 4) → '{"a":2,"c":4}'
jsonb_set
함수는 JSONB를 반환합니다.
json_object
json_object()
함수는 인자의 쌍으로 JSON 개체를 만듭니다.
json_object('a',2,'c',4) → '{"a":2,"c":4}'
jsonb_object
함수는 JSONB를 반환합니다.
json_patch
json_patch
함수는 JSON 객체에 대한 패치를 적용합니다. 두 번째 객체를 첫 번째 객체에 덮어 쓴다고 생각하면 됩니다.
json_patch('{"a":1,"b":2}','{"b":3,"d":4}') → '{ "a":1,"b":3,"d":4}'
jsonb_patch
함수는 JSONB를 반환합니다.
json_remove
json_remove
함수는 JSON 객체에서 특정 키를 제거합니다.
json_remove('[0,1,2,3,4]','$[2]') → '[0,1,3,4]'
jsonb_remove
함수는 JSONB를 반환합니다.
json_type
json_type
함수는 JSON 값의 유형을 반환합니다.
json_type('{"a":[2,3.5,true,false,null,"x"]}') → 'object'
json_valid
json_valid(X,Y)
함수는 인수 X
가 올바른 형식의 JSON이면 1
을 반환하고, X
가 형식이 올바르지 않으면 0
을 반환합니다.
Y
는 이 함수의 설정을 제어하는 옵션으로 생략할수 있습니다.
json_valid('{"x":35}') → 1
json_quote
json_quote
함수는 SQL 값을 JSON 표현으로 변환합니다.
json_quote('verdant') → '"verdant"'
json_each
json_each
함수는 JSON 배열의 각 요소에 대해 하나의 행을 반환합니다.
예를 들어 사용자의 전화번호를 JSON을 이용해 배열 형태로 저장했다고 가정해봅시다.
SELECT DISTINCT user.name
FROM user, json_each(user.phone)
WHERE json_each.value LIKE '704-%';
위와 같이 하면, 사용자의 전화 번호 중에 704로 시작하는 번호를 한 행씩 각각(each) 출력합니다.
json_tree
json_tree
함수는 JSON 객체를 순회합니다.
SELECT * FROM json_tree('{ "name" : "hong", "age" : 16 }');
위와 같이하면 결과는 아래와 같습니다.
+------+--------------------------+---------+------+----+--------+---------+------+
| key | value | type | atom | id | parent | fullkey | path |
+------+--------------------------+---------+------+----+--------+---------+------+
| null | {"name":"hong","age":16} | object | null | 0 | null | $ | $ |
| name | hong | text | hong | 2 | 0 | $.name | $ |
| age | 16 | integer | 16 | 4 | 0 | $.age | $ |
+------+--------------------------+---------+------+----+--------+---------+------+