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()