Json Daten mit MYSQL bearbeiten/auslesen

-André-

Erfahrenes Mitglied
Hallo,

ich habe folgende Frage:

In einer Tabelle habe ich eine Spalte, in der ein Array als JSON String gespeichert ist. Kann man innerhalb einer MYSQL Datenbank diesen String zurück in ein Array verwandeln, und dann z.B. den ersten eintrag und den letzten Eintrag des Arrays in einem View als eigene Spalte ausgeben?


Gruß

-André-
 
In dem JSON String sind nur Datumswerte eingetragen, also zB.:
["2012-01-09","2012-01-16","2012-01-23","2012-01-30","2012-02-06","2012-02-13","2012-02-27","2012-03-05","2012-03-12","2012-03-19"]

Allerdings habe die kodierten Array unterschiedliche längen.

Gruß

-André-
 
relativ einfach.
zuerst die [] und die " entfernen und anschliessend SUBSTRING_INDEX() das erste und letzte Datum auslesen

SQL:
SELECT
	SUBSTRING_INDEX(date_list, ',', 1) AS first_date,
	SUBSTRING_INDEX(date_list, ',', -1) AS last_date,
	prepared_data.*
FROM	
	(
		SELECT
			table_data.*,
			-- Entferne die [, ] und die "
			REPLACE(TRIM('[' FROM TRIM(']' FROM table_data.json)), '"', '') AS date_list
		FROM
			-- Simuliere die Daten
			(
				SELECT
					1 AS id,
					'["2012-01-09","2012-01-16","2012-01-23","2012-01-30","2012-02-06","2012-02-13","2012-02-27","2012-03-05","2012-03-12","2012-03-19"]' AS json
				UNION ALL SELECT
					2 AS id,
					'["2012-01-15","2012-01-16","2012-01-23","2012-01-30","2012-02-06"]' AS json
				UNION ALL SELECT
					3 AS id,
					NULL AS json
			) AS table_data
	) AS prepared_data

Ergibt
Code:
first_date | last_date  | id | json                                                                                                            | date_list
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2012-01-09 | 2012-03-19 | 1  | [2012-01-09,2012-01-16,2012-01-23,2012-01-30,2012-02-06,2012-02-13,2012-02-27,2012-03-05,2012-03-12,2012-03-19] | 2012-01-09,2012-01-16,2012-01-23,2012-01-30,2012-02-06,2012-02-13,2012-02-27,2012-03-05,2012-03-12,2012-03-19
2012-01-15 | 2012-02-06 | 2  | [2012-01-15,2012-01-16,2012-01-23,2012-01-30,2012-02-06]                                                        | 2012-01-15,2012-01-16,2012-01-23,2012-01-30,2012-02-06
NULL       | NULL       | 3  | NULL                                                                                                            | NULL


Nachtrag: Wenn du den Datumsstring in ein Datum wandeln willst, dann kannst du ncoh STR_TO_DATE() über das Feld machen
SQL:
...
	STR_TO_DATE(SUBSTRING_INDEX(date_list, ',', 1), '%Y-%m-%d') AS first_date,
	STR_TO_DATE(SUBSTRING_INDEX(date_list, ',', -1), '%Y-%m-%d') AS last_date,
...
 
Zuletzt bearbeitet von einem Moderator:
Danke für die schnelle Antwort,

wenn ich mit SUBSTRING_INDEX arbeite schneide ich ja einfach vorne bzw. hinten einen Teil aus dem String heraus. Gibt es eine Möglichkeit, dass ich herausfinde, wie viele Einträge in dem JSON Array stehen?

Gruß

-André-
 
Jepp, gibt es

SQL:
...
	CASE IFNULL(LENGTH(date_list), 0) WHEN 0	
		-- Bei der Länge NULL oder 0 ist kein Datum vorhanden		
		THEN 0
		-- Anzahl Kommas zählen indem ich die Länge des String mit und ohne Kommas vergleiche und 1 dazuzählen
		ELSE LENGTH(date_list)-LENGTH(REPLACE(date_list, ',', '')) +1
	END AS cnt_dates,
...
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück