SQL Error (1064) [Résolu]

Signaler
Messages postés
69
Date d'inscription
mardi 26 février 2019
Statut
Membre
Dernière intervention
27 mai 2021
-
Messages postés
69
Date d'inscription
mardi 26 février 2019
Statut
Membre
Dernière intervention
27 mai 2021
-
j'ai la table gs_object (date, lat,lng,params) dont :
params de type : Varchar et non plus JSON
{"io240":"0","io80":"0","io67":"4043","io68":"0","io241":"60502","io199":"0"}
Version Mysql : 5.6.12
Pour lire io240 j'ai fait : SELECT params->'$.io240 ' FROM gs_object ;

SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '>'$.io240'


Comment je peut lire io240 ?

3 réponses

Messages postés
69
Date d'inscription
mardi 26 février 2019
Statut
Membre
Dernière intervention
27 mai 2021

quelqu'un a une idée ?
Messages postés
32933
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
9 juin 2021
3 553
Oui
Messages postés
32933
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
9 juin 2021
3 553 >
Messages postés
32933
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
9 juin 2021

En tout cas ça ne se fera pas via une requête SQL, mais dans le langage de programmation que tu utilises afin de convertir la string en objet json afin d'en récupérer le contenu.
Messages postés
69
Date d'inscription
mardi 26 février 2019
Statut
Membre
Dernière intervention
27 mai 2021
>
Messages postés
32933
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
9 juin 2021

Non je doit récupérer les valeurs via requête SQL car je doit faire l'insertion dans une autre table.
Messages postés
32933
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
9 juin 2021
3 553 >
Messages postés
69
Date d'inscription
mardi 26 février 2019
Statut
Membre
Dernière intervention
27 mai 2021

Ah je n'avais pas bien compris ta question.

Donc, dans la bdd, tu as un champ de type varchar (le champs Params ) qui contient une string qui représente un JSON.
As tu essayé de faire un CAST de la colonne dans ta requête et utiliser ou sous requête ?

Un truc du genre
SELECT T.jsonparams->'$.io240 ' 
  FROM ( 
   SELECT CAST(params as JSON) as jsonparams
   FROM gs_object
 ) T ;



Voir la doc pour manipuler les JSON si besoin
https://dev.mysql.com/doc/refman/8.0/en/json.html
Messages postés
69
Date d'inscription
mardi 26 février 2019
Statut
Membre
Dernière intervention
27 mai 2021
>
Messages postés
32933
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
9 juin 2021

Toujours le meme erreur : La version de Mysql est 5.6.12 qui n'accepte pas JSON .
/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '>'$.io240'
FROM (SELECT CAST(params as JS' at line 1 */
Messages postés
32933
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
9 juin 2021
3 553
Ah ben si tu ne nous donnes pas toutes les infos dès le départ......... :-(

Donc, à part faire une fonction personnalisée, le format JSON n'est en effet pas dispo avant la version 5.7

Je t'invite à regarder cette discussion :
https://stackoverflow.com/questions/37816269/how-to-get-values-from-mysql5-6-column-if-that-contains-json-document-as-strin


#jsonanalytic function       
DELIMITER $$
 
DROP FUNCTION IF EXISTS `json_extract_c`$$
 
CREATE FUNCTION `json_extract_c`(
details TEXT,
required_field VARCHAR (255)
) RETURNS TEXT CHARSET latin1
BEGIN
SET details = SUBSTRING_INDEX(details, "{", -1);
SET details = SUBSTRING_INDEX(details, "}", 1);
RETURN TRIM(
    BOTH '"' FROM SUBSTRING_INDEX(
        SUBSTRING_INDEX(
            SUBSTRING_INDEX(
                details,
                CONCAT(
                    '"',
                    SUBSTRING_INDEX(required_field,'$.', -1),
                    '":'
                ),
                -1
            ),
            ',"',
            1
        ),
        ':',
        -1
    )
) ;
END$$
DELIMITER ;
Messages postés
69
Date d'inscription
mardi 26 février 2019
Statut
Membre
Dernière intervention
27 mai 2021

Oui c'est ca , j'ai le résultat avec : SELECT json_extract_c (params,"$.io240") FROM gs_object;
J'utilise PHP donc pour faire insert from select j'ai fait comme ca :

$sql = "INSERT INTO gs_dat (io1)
SELECT
(json_extract_c (gs.params,"$.io1")) io1
FROM gs_objects gs;


qui retourne : ( ! ) Parse error: syntax error, unexpected '$' in
Messages postés
32933
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
9 juin 2021
3 553 >
Messages postés
69
Date d'inscription
mardi 26 février 2019
Statut
Membre
Dernière intervention
27 mai 2021

Tu as utilisé les doubles côte à l'intérieur d'une chaîne qui est elle-même entre double quote...
Messages postés
69
Date d'inscription
mardi 26 février 2019
Statut
Membre
Dernière intervention
27 mai 2021

il faut un simple cote :

$sql = "INSERT INTO gs_dat (io1)
SELECT
(json_extract_c (gs.params,'$.io1')) io1
FROM gs_objects gs;