sql >> Database teknologi >  >> RDS >> Mysql

MySQL REPLACE:Sådan erstatter alle forekomster af en char i hver enkelt understreng afgrænset af samme hoved og hale

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




    1. Hvor hurtigt er ODBC? En "belastet" sammenligning.

    2. Ret "FEJL:mangler FROM-klausulindtastning for tabel" i PostgreSQL, når du bruger UNION, EXCEPT eller INTERSECT

    3. Sådan opretter du forbindelse til MySQL ved hjælp af Node.js

    4. Udskriv resultater i MySQL-format med Python