web-dev-qa-db-fra.com

Extraire la valeur sans guillemet du type de données MySQL JSON

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                        |
+-----------------------------+

?

25
Willem van Gerven

Vous pouvez utiliser l'opérateur - >> pour extraire des données non cotées, simplement!

SELECT JSONCOL->>'$.PATH' FROM tableName

Deux autres manières:

  • JSON_UNQUOTE (JSON_EXTRACT (colonne, chemin))
  • JSON_UNQUOTE (colonne-> chemin)

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

53
MohaMad

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.

41
ivan88

vous pouvez utiliser la fonction CAST () pour convertir un objet json en varchar

SELECT CAST(json_extract(data,'$.type') AS VARCHAR) FROM test;
0
Nir Levy