2016-06-14 4 views
10

enthält Wie Werte von MySQL bekommen (5.6) Spalte, wenn das enthält json Dokument als StringWie Werte von MySQL bekommen (5.6) Spalte, wenn der json Dokument als String

Zum Beispiel, wenn wir einen Tisch haben - Mitarbeiter Wir haben drei Farben ID, Name und Ausbildungen. educations und coloumn enthält Daten als Json Dokument { "ug": "bsc", "pg": "mca", "ssc": "10"} Ich brauche den Wert von ug und pg von educations Spalte

Können wir das mit MySQL (5.6) Abfragen tun?

+0

MySQL weiß nichts über JSON-Daten. Dazu ist es nur ein Datenblob. Sie müssen das JSON * entziffern, nachdem Sie es aus der Datenbank abgerufen haben (mit der Sprache, die Sie für den Zugriff auf die Datenbank verwenden). –

+0

Es sieht so aus, als ob MySQL 5.7 JSON-Unterstützung hinzufügt: https://dev.mysql.com/doc/refman/5.7/en/json.html#json-paths –

Antwort

13

Um zu tun, was Sie wollen, benötigen Sie MySQL 5.7.8+. Seit 5.7.8 können Sie JSON_EXTRACT Funktion verwenden, um einen Wert aus einer JSON-Zeichenfolge zu extrahieren:

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

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

von here genommen.

In MySQL 5.6 können Sie einfach nicht den gewünschten Wert erhalten, da MySQL nichts darüber weiß, was ein JSON-Objekt ist. So Ihre Optionen sind:

8

In MySQL 5.6, von def ault JSON_EXTRACT ist nicht standardmäßig verfügbar.
Wenn Sie weiterhin auf json-Daten in MySQL 5.6 zugreifen müssen, müssen Sie eine benutzerdefinierte Funktion schreiben.

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 ; 

Dies wird helfen. Ich habe es erstellt und getestet.

+0

Der Rückgabewert enthält "}" am Ende plus gegeben: { „Abstand“: 55.62, „totalDistance“: 11.946,83} JSON_EXTRACT_C (Attribute, „$ .distance“) gibt 11.946,83} – user3631341

+0

Ihre Daten überprüfen, ich bin mit dieser Funktion als Ersatz von vergangenen Monaten mit nicht einem einzigen Problem überhaupt. – rahulsm

+0

Können Sie meine Daten testen? – user3631341

3

Antwort des Rahul nicht ganz gut für mich, so dass ich es bearbeitet und dies war für mich:

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

Beide bisherigen Antworten nicht für mich arbeiten, wenn das Element nicht in JSON Text erwähnt wurde . Es gibt meine verbesserte Funktion:

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 ; 
Verwandte Themen