2016-06-14 27 views
10

Come ottenere i valori da MySQL (5.6) colonna se che contiene il documento JSON come stringaCome ottenere i valori da MySQL (5.6) colonna se che contiene il documento JSON come stringa

Per esempio, se abbiamo un tavolo - dipendente in quanto abbiamo tre idole, id, nome ed educazione. e Coloumn educazioni contiene dati come un documento JSON { "ug": "BSC", "pg": "mca", "ssc": "10 °"} Ho bisogno del valore di ug e pg dalla colonna educazioni

Possiamo farlo usando le query MySQL (5.6) ??

+0

MySQL non sa nulla di dati JSON. Ad esso, è solo un blob di dati. Dovrai decodificare il JSON * dopo * recuperandolo dal database (utilizzando qualsiasi lingua tu stia utilizzando per accedere al db). –

+0

Sembra che MySQL 5.7 aggiunga il supporto JSON: https://dev.mysql.com/doc/refman/5.7/en/json.html#json-paths –

risposta

13

Per poter eseguire ciò che si desidera, è necessario MySQL 5.7.8+. Dal momento 5.7.8 è possibile utilizzare la funzione JSON_EXTRACT per estrarre un valore da una stringa JSON:

SELECT JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name'); 

+---------------------------------------------------------+ 
| JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name') | 
+---------------------------------------------------------+ 
| "Aztalan"            | 
+---------------------------------------------------------+ 

Tratto da here.

In MySQL 5.6 non è possibile ottenere il valore desiderato poiché MySQL non sa nulla di ciò che è un oggetto JSON. Quindi, le opzioni sono:

  • aggiornamento a 5.7.8+
  • analizzare il risultato di una query con qualcosa che gestisce JSON:
8

In MySQL 5.6, da DEF ault JSON_EXTRACT non è disponibile per impostazione predefinita.
Se è ancora necessario accedere ai dati json in MySQL 5.6, è necessario scrivere la funzione personalizzata.

DELIMITER $$ 

DROP FUNCTION IF EXISTS `json_extract_c`$$ 

CREATE DEFINER=`root`@`%` FUNCTION `json_extract_c`(
    details TEXT, 
    required_field VARCHAR (255) 
) RETURNS TEXT CHARSET latin1 
BEGIN 
    RETURN TRIM(
    BOTH '"' FROM SUBSTRING_INDEX(
     SUBSTRING_INDEX(
     SUBSTRING_INDEX(
      details, 
      CONCAT(
      '"', 
      SUBSTRING_INDEX(required_field,'$.', - 1), 
      '"' 
     ), 
      - 1 
     ), 
     '",', 
     1 
    ), 
     ':', 
     - 1 
    ) 
) ; 
END$$ 

DELIMITER ; 

Questo aiuterà. L'ho creato e testato.

+0

Il valore restituito contiene "}" alla fine e inoltre: {"distance": 55.62, "totalDistance": 11946.83} JSON_EXTRACT_C (attributi, "$ .distance") dà 11946.83} – user3631341

+0

controlla i tuoi dati, sto usando questa funzione come una sostituzione degli ultimi mesi con non un singolo problema a tutti. – rahulsm

+0

Puoi testare usando i miei dati? – user3631341

3

risposta di Rahul non ha funzionato abbastanza bene per me, così ho modificato e questo ha funzionato per me:

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 ; 
2

Entrambe le risposte precedenti non ha funzionato per me quando l'elemento non è stato menzionato nel testo JSON . C'è la mia funzione migliorata:

DELIMITER $$ 

DROP FUNCTION IF EXISTS `json_extract_c`$$ 

CREATE FUNCTION `json_extract_c`(
details TEXT, 
required_field VARCHAR (255) 
) RETURNS TEXT CHARSET latin1 
BEGIN 
    DECLARE search_term TEXT; 
    SET details = SUBSTRING_INDEX(details, "{", -1); 
    SET details = SUBSTRING_INDEX(details, "}", 1); 
    SET search_term = CONCAT('"', SUBSTRING_INDEX(required_field,'$.', - 1), '"'); 
    IF INSTR(details, search_term) > 0 THEN 
    RETURN TRIM(
     BOTH '"' FROM SUBSTRING_INDEX(
     SUBSTRING_INDEX(
      SUBSTRING_INDEX(
      details, 
      search_term, 
      - 1 
     ), 
      ',"', 
      1 
     ), 
     ':', 
     -1 
    ) 
    ); 
    ELSE 
    RETURN NULL; 
    END IF; 
END$$ 

DELIMITER ; 
Problemi correlati