J'ai commencé à utiliser le type de données JSON dans mysql 5.7. Existe-t-il un moyen d'extraire une valeur sans les guillemets? Par exemple lors de la configuration d'un index virtuel.
Exemple:
mysql> INSERT INTO test (data) VALUES ('{"type": "user" ,
"content" : { "username": "jdoe", "firstname" : "John", "lastname" : "Doe" } }');
mysql> SELECT json_extract(data,'$.type') FROM test;
+-----------------------------+
| json_extract(data,'$.type') |
+-----------------------------+
| "user" |
+-----------------------------+
Comment avoir
+-----------------------------+
| json_extract(data,'$.type') |
+-----------------------------+
| user |
+-----------------------------+
?
Vous pouvez utiliser l'opérateur - >> pour extraire des données non cotées, simplement!
SELECT JSONCOL->>'$.PATH' FROM tableName
Deux autres manières:
Remarque: Trois façons différentes donnent la même commande, comme l'explique EXPLAIN
:
Comme avec ->, l'opérateur - >> est toujours développé dans la sortie d'EXPLAIN, comme le montre l'exemple suivant:
EXPLAIN SELECT c->>'$.name' AS name FROM jemp WHERE g > 2 ; SHOW WARNINGS ; *************************** 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)
en savoir plus sur le manuel de référence MySQL https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html#operator_json-inline-path
Remarque: L'opérateur - >> a été ajouté dans MySQL 5.7.13
Vous pouvez utiliser la méthode JSON_UNQUOTE ():
SELECT JSON_UNQUOTE(json_extract(data,'$.type')) FROM test;
Cette méthode traitera des citations internes, par exemple:
SET @t1 := '{"a": "Hello \\\"Name\\\""}';
SET @j := CAST(@t1 AS JSON);
SET @tOut := JSON_EXTRACT(@j, '$.a');
SELECT @t1, @j, @tOut, JSON_UNQUOTE(@tOut), TRIM(BOTH '"' FROM @tOut);
va donner:
@t1 : {"a": "Hello \"Name\""}
@j : {"a": "Hello \"Name\""}
@tOut : "Hello \"Name\""
unquote : Hello "Name"
trim : Hello \"Name\
Je crois que la citation est meilleure dans presque toutes les circonstances.
vous pouvez utiliser la fonction CAST () pour convertir un objet json en varchar
SELECT CAST(json_extract(data,'$.type') AS VARCHAR) FROM test;