2016-11-11 5 views
0

Diese AbfrageMysql Split Spalte String in drei Reihen

SELECT user_Id,CAST(leave_dates_object AS CHAR(10000) CHARACTER SET utf8) AS LeaveDates 
FROM `lms_leaves` 

kehren

enter image description here

Jetzt möchte ich drei Reihen User_ID und Datum und F_or_H aus der formatierten String Rückkehr aus dem Urlaub Datum.

Ich modifizierte und versuchte code from this link, aber kann nicht zum Ergebnis kommen.

Erwarteter Ausgang

user_Id Date LeaveType 
85 2016-09-06 F 
85 2016-09-07 F 
85 2016-09-06 H 
63 2016-03-25 F 
63 2016-03-02 F 
63 2016-03-03 H 

Bitte helfen Sie mir.

+1

Sie das Datum wollen, sieht es aus wie einige Werte von LeaveDates mehr als ein Datum haben - zu welchem ​​Zeitpunkt wollen Sie? –

+0

Ich möchte Benutzer-ID, Datum, LeaveType (F oder D) für jedes Datum in LeaveDates befindet. –

+0

könnten Sie ein Beispiel dafür zeigen, wie Ihre Ausgabe aussehen soll? –

Antwort

2

Angenommen, Sie maximal 8 Tage, in einem Datensatz haben:

create table users (userId int not null, leaveDates varchar(1000) not null); 

INSERT users (userId,leaveDates) VALUES (85,'--- \r-2016-09-06:F\r-2016-09-07:F'),(85,'---\r-2016-09-06:H'),(63,'---\r-2016-03-25:F'),(63,'---\r-2016-03-02:F\r-2016-03-03:H'); 

SELECT s.userId AS userId,LEFT(s.leaveDate,CHAR_LENGTH(s.leaveDate)-2) AS ldate, RIGHT(s.leaveDate,1) AS lflag 
FROM (
    SELECT 
    u.userId, 
     REPLACE(SUBSTRING(SUBSTRING_INDEX(u.leaveDates, '\r-', n.number), 
     CHAR_LENGTH(SUBSTRING_INDEX(u.leaveDates, '\r-', n.number -1)) + 1), 
     '\r-', '') as leaveDate 
    FROM (SELECT u0.userId,REPLACE(u0.leaveDates,'---','') AS leaveDates FROM users u0) u 
    INNER JOIN (SELECT 1 AS number UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8) n 
    ON (char_length(u.leaveDates) - char_length(replace(u.leaveDates, '\r-', '')) >= n.number-1)) s 
WHERE s.leaveDate<>'' 
ORDER BY userId,ldate,lflag;