MySQL
Wyodrębnij wartości z typu JSON
Szukaj…
Wprowadzenie
MySQL 5.7.8+ obsługuje natywny typ JSON. Chociaż masz różne sposoby tworzenia obiektów Json, możesz także uzyskiwać dostęp do członków i czytać je na różne sposoby.
Główną funkcją jest JSON_EXTRACT
, dlatego operatorzy ->
i ->>
są bardziej przyjaźni.
Składnia
- JSON_EXTRACT (json_doc, ścieżka [, ...])
- JSON_EXTRACT (json_doc, ścieżka)
- JSON_EXTRACT (json_doc, ścieżka 1, ścieżka 2)
Parametry
Parametr | Opis |
---|---|
json_doc | ważny dokument JSON |
ścieżka | ścieżka członków |
Uwagi
Wspomniany w Podręczniku referencyjnym MySQL 5.7
- Wiele dopasowanych wartości według argumentów ścieżki
Jeśli możliwe jest, że te argumenty mogą zwrócić wiele wartości, dopasowane wartości są automatycznie zawijane jako tablica, w kolejności odpowiadającej ścieżkom, które je wytworzyły. W przeciwnym razie zwracana wartość to pojedyncza dopasowana wartość.
- Wynik
NULL
gdy:- każda argumentacja jest zerowa
- ścieżka niezgodna
Zwraca NULL, jeśli jakikolwiek argument ma wartość NULL lub żadna ścieżka nie znajduje wartości w dokumencie.
Odczytaj wartość tablicy JSON
Utwórz zmienną @myjson jako typ JSON ( czytaj więcej ):
SET @myjson = CAST('["A","B",{"id":1,"label":"C"}]' as JSON) ;
SELECT
niektórych członków!
SELECT
JSON_EXTRACT( @myjson , '$[1]' ) ,
JSON_EXTRACT( @myjson , '$[*].label') ,
JSON_EXTRACT( @myjson , '$[1].*' ) ,
JSON_EXTRACT( @myjson , '$[2].*')
;
-- result values:
'\"B\"', '[\"C\"]', NULL, '[1, \"C\"]'
-- visually:
"B", ["C"], NULL, [1, "C"]
Operatory wyodrębniania JSON
Wyodrębnij path
przez ->
lub ->>
Operatory, podczas gdy ->>
jest wartością UNQUOTED:
SELECT
myjson_col->>'$[1]' , myjson_col->'$[1]' ,
myjson_col->>'$[*].label' ,
myjson_col->>'$[1].*' ,
myjson_col->>'$[2].*'
FROM tablename ;
-- visuall:
B, "B" , ["C"], NULL, [1, "C"]
--^^^ ^^^
Więc col->>path
jest równa JSON_UNQUOTE(JSON_EXTRACT(col,path))
:
Podobnie jak w przypadku ->, operator - >> jest zawsze rozwijany w wyniku EXPLAIN, jak pokazano w poniższym przykładzie:
mysql> EXPLAIN SELECT c->>'$.name' AS name -> FROM jemp WHERE g > 2\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: jemp partitions: NULL type: range possible_keys: i key: i key_len: 5 ref: NULL rows: 2 filtered: 100.00 Extra: Using where 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Note Code: 1003 Message: /* select#1 */ select json_unquote(json_extract(`jtest`.`jemp`.`c`,'$.name')) AS `name` from `jtest`.`jemp` where (`jtest`.`jemp`.`g` > 2) 1 row in set (0.00 sec)
Przeczytaj o wyciągu ze ścieżki wbudowanej (+)