MySQL
Estrai valori dal tipo JSON
Ricerca…
introduzione
MySQL 5.7.8+ supporta il tipo JSON nativo. Mentre hai diversi modi per creare oggetti JSON, puoi anche accedere e leggere i membri in modi diversi.
La funzione principale è JSON_EXTRACT
, quindi gli operatori ->
e ->>
sono più amichevoli.
Sintassi
- JSON_EXTRACT (json_doc, percorso [...])
- JSON_EXTRACT (json_doc, percorso)
- JSON_EXTRACT (json_doc, path1, path2)
Parametri
Parametro | Descrizione |
---|---|
json_doc | documento JSON valido |
sentiero | percorso dei membri |
Osservazioni
Citato in MySQL 5.7 Manuale di riferimento
- Più valori abbinati per argomento / i di percorso
Se è possibile che tali argomenti possano restituire più valori, i valori corrispondenti vengono autowrapped come array, nell'ordine corrispondente ai percorsi che li hanno prodotti. Altrimenti, il valore di ritorno è il singolo valore corrispondente.
-
NULL
Risultato quando:- qualsiasi argomento è NULL
- percorso non corrispondente
Restituisce NULL se qualsiasi argomento è NULL o nessun percorso trova un valore nel documento.
Leggi il valore dell'array JSON
Crea la variabile @myjson come tipo JSON ( leggi di più ):
SET @myjson = CAST('["A","B",{"id":1,"label":"C"}]' as JSON) ;
SELECT
alcuni membri!
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"]
Operatori di estrazione JSON
Estrai path
da ->
o ->>
Operatori, mentre ->>
è UNQUOTED valore:
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"]
--^^^ ^^^
Quindi col->>path
è uguale a JSON_UNQUOTE(JSON_EXTRACT(col,path))
:
Come con ->, l'operatore - >> è sempre espanso nell'output di EXPLAIN, come dimostra il seguente esempio:
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)