Запросы к данным 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+) запрашивает данные JSON через выражения путей SQL/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"}';Тип jsonb в PostgreSQL предлагает богатый набор операторов: -> (объект/элемент json), ->> (текстовое значение), #> (путь), @> (вхождение), ? (наличие ключа). Индекс GIN ускоряет запросы с @> и ?. Возможны и запросы по путям SQL/JSON через jsonb_path_query.
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 через JSON_EXTRACT(); оператор -> — сокращение для 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) обеспечивает чтение и запись на основе JSONPath через JSON.SET/JSON.GET. Вместе с 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 критично для корректности.