JSON 데이터 조회
Oracle
-- Extract a scalar value with JSON_VALUE:
SELECT JSON_VALUE(data, '$.customer.city') AS city FROM orders;
-- Expand into rows with JSON_TABLE:
SELECT t.product, t.quantity
FROM orders s,
JSON_TABLE(s.data, '$.items[*]'
COLUMNS (product VARCHAR2(50) PATH '$.product',
quantity NUMBER PATH '$.quantity')) t;Oracle(12c+)은 SQL/JSON 경로 표현식으로 JSON 데이터를 조회한다. JSON_VALUE는 단일 스칼라 값을, JSON_QUERY는 객체/배열 조각을 반환하며, JSON_TABLE은 JSON을 관계형 행-컬럼 구조로 변환한다. 21c+는 네이티브 JSON 데이터 타입을 지원한다.
PostgreSQL
-- jsonb operators:
SELECT data->'customer'->>'city' AS city FROM orders;
-- Containment (@>) and a GIN index:
CREATE INDEX ix ON orders USING GIN (data);
SELECT * FROM orders
WHERE data @> '{"status": "approved"}';PostgreSQL jsonb 타입은 풍부한 연산자를 제공한다: ->(json 객체/요소), ->>(텍스트 값), #>(경로), @>(포함), ?(키 존재). GIN 인덱스는 @>와 ? 쿼리 속도를 높인다. jsonb_path_query로 SQL/JSON path 쿼리도 가능하다.
MySQL
-- JSON_EXTRACT or shorthand operators:
SELECT JSON_EXTRACT(data, '$.customer.city') AS city FROM orders;
-- ->> returns unquoted text:
SELECT data->>'$.customer.city' AS city FROM orders
WHERE data->>'$.status' = 'approved';MySQL(5.7+)은 JSON_EXTRACT()로 네이티브 JSON 타입을 조회한다. -> 연산자는 JSON_EXTRACT의, ->>는 JSON_UNQUOTE(JSON_EXTRACT())의 약식 표기다. JSON 필드 검색은 generated column + 인덱스로 가속할 수 있다.
SQL Server
-- Extract a scalar value with JSON_VALUE:
SELECT JSON_VALUE(data, '$.customer.city') AS city FROM orders;
-- Expand into rows with OPENJSON:
SELECT k.product, k.quantity
FROM orders s
CROSS APPLY OPENJSON(s.data, '$.items')
WITH (product NVARCHAR(50) '$.product', quantity INT '$.quantity') k;SQL Server(2016+)는 JSON을 NVARCHAR 컬럼에 저장한다. JSON_VALUE는 스칼라 값을, JSON_QUERY는 객체/배열을 반환하며, OPENJSON은 JSON을 테이블 형태로 변환한다. ISJSON()으로 유효성을 검사한다. JSON 경로 조회는 computed column + 인덱스로 가속할 수 있다.
MongoDB
// MongoDB is natively a document (BSON/JSON) database.
// Access nested fields with dot notation:
db.orders.find({ "customer.city": "Ankara" })
// Array element and projection:
db.orders.find(
{ "items.product": "pen" },
{ "items.$": 1 }
)MongoDB는 모든 데이터를 문서(JSON과 유사한 BSON)로 저장하므로 조회가 네이티브로 이루어진다. 점 표기법으로 중첩 필드와 배열 요소에 접근한다. 복잡한 변환은 Aggregation Pipeline으로 수행하며, 인덱스로 중첩 필드를 빠르게 조회할 수 있다.
Redis
# Requires the RedisJSON module (Redis Stack).
# Write a JSON document:
JSON.SET order:1 $ '{"customer":{"city":"Ankara"},"status":"approved"}'
# Read a value with JSONPath:
JSON.GET order:1 $.customer.city기본 Redis에는 JSON 타입이 없다. RedisJSON 모듈(Redis Stack)이 JSON.SET/JSON.GET으로 JSONPath 기반 읽기와 쓰기를 제공한다. RediSearch와 함께 사용하면 JSON 문서를 인덱싱하고 조회할 수 있다. 모듈이 없으면 JSON은 문자열로 저장되어 애플리케이션에서 파싱한다.
Elasticsearch
# Documents are already JSON; query fields directly:
GET orders/_search
{ "query": { "term": { "customer.city": "Ankara" } } }
# For nested arrays, use the nested type and a nested query:
GET orders/_search
{ "query": { "nested": { "path": "items",
"query": { "match": { "items.product": "pen" } } } } }Elasticsearch는 문서를 네이티브 JSON으로 저장하고 인덱싱한다. 중첩 객체 배열에서 요소 경계를 유지하려면 'nested' 필드 타입과 nested 쿼리를 사용한다. 그렇지 않으면 object 타입 배열이 평탄화된다(교차 매칭 위험). object와 nested의 구분은 정확성에 매우 중요하다.