JSON_VALUE
JSON_VALUE(json_doc, path)
Zwraca wartość (ciąg znaków, liczbę) pod podaną ścieżką bez cudzysłowów. Dla obiektów i tablic zwraca NULL. Istnieje w MariaDB od 10.2 i w MySQL od 8.0.21.
Parametry
- json_doc – dokument JSON.
- path – ścieżka do prostej wartości, na przykład $.origin.
Przykłady
Wyniki pochodzą z MariaDB – MySQL 8.0.18, na którym sprawdzano przykłady, tej funkcji jeszcze nie ma:
CREATE TABLE products_json (id INT PRIMARY KEY, params JSON);
INSERT INTO products_json VALUES
(1, '{"weight": 1000, "origin": "Brazil", "tags": ["beans", "sale"]}'),
(2, '{"weight": 100, "origin": "China", "tags": ["loose leaf"]}'),
(5, '{"weight": 850, "material": "ceramic", "tags": []}');
SELECT id, JSON_VALUE(params, '$.origin') AS origin, JSON_VALUE(params, '$.weight') AS weight, JSON_VALUE(params, '$.tags') AS tag_array
FROM products_json
ORDER BY id;
Wynik w MariaDB:
+----+--------+--------+-----------+ | id | origin | weight | tag_array | +----+--------+--------+-----------+ | 1 | Brazil | 1000 | NULL | | 2 | China | 100 | NULL | | 5 | NULL | 850 | NULL | +----+--------+--------+-----------+
Produkty cięższe niż 500 g – zamień wartość na liczbę:
SELECT id FROM products_json WHERE CAST(JSON_VALUE(params, '$.weight') AS UNSIGNED) > 500 ORDER BY id;
Wynik w MariaDB:
+----+ | id | +----+ | 1 | | 5 | +----+
Na co uważać
- MySQL ma JSON_VALUE() dopiero od wersji 8.0.21. W kodzie, który ma działać także w starszych wersjach, użyj JSON_UNQUOTE(JSON_EXTRACT(…)).
- Dla tablic i obiektów zwraca NULL – do nich użyj JSON_EXTRACT().
- Wynik jest ciągiem znaków. Porównanie liczbowe bez zamiany (CAST) może odbyć się jako porównanie tekstu.
- Częste warunki na JSON przyspieszy kolumna generowana z indeksem (ALTER TABLE … ADD weight INT AS (JSON_VALUE(…)) i indeks na niej).
Zobacz też:
JSON_EXTRACT()
JSON_UNQUOTE()
CAST()