det er kun muligt i ren MySQL uden brug af en fuldblæst HTML-parser eller en UDF, der ville importere REGEX_REPLACE funktion til MySQL.
Tricket er ved at bruge en talgenerator og ved at bruge en indlejret SUBSTRING_INDEX til at opdele den store streng på html-tags
Denne talgenerator vil generere tal fra 1 til 10.000
Så "parseren" vil understøtte op til 10.000 tags, hvis du har brug for flere, skal du tilføje flere
CROSS JOIN ( SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 ) SOM record_[nummer]
Forespørgsel
VÆLG (@nummer :=@nummer + 1) SOM nummerFRA ( SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) AS record_1CROSS JOIN ( SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) AS record_2CROSS JOIN ( SELECT 1 UNION SELECT 43 UNION SELECT SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) AS record_3CROSS JOIN ( SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 10) AS record_4CROSS JOIN ( SELECT @number :=0 ) AS init_user_param
denne SQL-sætning vil blive brugt til at opdele på HTML-tag
SQL-erklæring
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX([large_html_string], ">", [tag_position]), ">", -1), ">") som tag
Tricket nu er at kombinere talgeneratoren og html-strengen splittig. Så [tag_position] er fyldt med et tal fra talgeneratoren.
Dette gøres med en CROSS JOIN.
Forespørgsel
SELECT *FROM ( SELECT CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(data, ">", generator.number), ">", -1), ">") som tag FROM ( SELECT '
C10373 - FIAT GROUP AUTOMOBILES/RAMO DI AZIENDA DI KUEHNE + NAGEL
somma pari a € 400+IVA per l'attività
TELE+ A 20.000 LIRE AL MESE
a mano o via fax al numero +39.00.0.0.0.00.
Il pointeggio base sarà incrementato di un + al ricorrere di ciascuna delle seguenti condizioni:
Obblighi contrattuali
Obblighi contrattuali
Lettera di invito
Obblighi contrattuali
Disciplinære di gara
Determina di aggiudicazione
' AS data ) AS record CROSS JOIN ( SELECT (@number :=@number + 1) ) SOM nummer FRA ( SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 ) SOM record_1 CROSS JOIN (VÆLG 1 UNION SELECT 2 UNION SELECT 3 UNION 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 ) AS record_2 CROSS JOIN ( SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 8 UNION SELECT 7 UNION SELECT 9 UNION SELECT 10 ) AS record_3 CROSS JOIN ( SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNIO N SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 ) AS record_4 CROSS JOIN ( SELECT @number :=0 ) AS init_user_param ) AS generator ) AS tagsWHERE tags.tag !='>'
se demo http://www.sqlfiddle.com/#!9/de2ed/32
Nu har vi taggene som adskilte poster, det er virkelig nemt kun at erstatte dem med i poster, der indeholder "href".
SQL-sætning
( CASE NÅR LOCATE("href", tags.tag)> 0 SÅ ERSTAT(tags.tag, "+", " ") ELSE tags.tag END ) AS tag
se demo http://www.sqlfiddle.com/#!9/de2ed/38
Nu hvor vi ved, hvordan vi erstatter nu, vil vi flette posterne tilbage til én streng. Vi kan bruge GROUP_CONCAT til det.
Forespørgsel
SET SESSION group_concat_max_len =@@max_allowed_packet; SELECT GROUP_CONCAT( CASE NÅR LOCATE("href", tags.tag)> 0 SÅ ERSTAT(tags.tag, "+", " ") ELSE tags.tag END SEPARATOR "" ) SOM html FRA ( SELECT CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX) (data, ">", generator.number), ">", -1), ">") som tag FROM ( VÆLG '
C10373 - FIAT GROUP AUTOMOBILES/RAMO DI AZIENDA DI KUEHNE + NAGEL
somma pari a € 400+IVA per l'attività
TELE+ A 20.000 LIRE AL MESE
en mano o via fax al numero +39.00.0.0.0.00.
Il punteggio base sarà incrementato di un + al ricorrere di ciascuna delle seguenti condizioni:
Obblighi contrattuali
Obblighi contrattuali
Lettera di invito
Obblighi contrattuali
Disciplinare di gara
Determina di aggiudicazione
' AS data ) AS record CROSS JOIN ( SELECT (@number :=@number + 1) AS number FROM ( SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 ) AS record_1 CROSS JOIN ( SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 9 UNION SELECT 10 ) AS record_2 CROSS JOIN ( SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 ) SOM record_3 CROSS JOIN (VÆLG 1 UNION SELECT 2 UNION SELECT 43 UNION SELECT UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 ) AS record_4 CROSS JOIN ( SELECT @number :=0 ) AS init_user_param ) AS generator ) AS tags WHERE tags.tag !='>'
se demo for hele forespørgslen
http://www.sqlfiddle.com/#!9/de2ed/46