MySQL REPLACE : How replace all occurrences of a char in every distinct substring delimited by the same head and tail

前端 未结 1 1834
暗喜
暗喜 2021-01-21 22:58

I have this string:

C10373 - FIAT GROUP AUTOMOBILES/RAMO DI AZIENDA DI KUEHNE + NAGEL

la somma pari

1条回答
  •  甜味超标
    2021-01-21 23:38

    it's possible in pure MySQL only without the use off a full blown HTML parser or a UDF that would import REGEX_REPLACE function into MySQL.

    The trick is by using a number generator and by using a nested SUBSTRING_INDEX to split the large string on the html tags
    This number generator will generate number from 1 to 10.000
    So the "parser" will support up to 10.000 tags if you need more you need to add more

    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
        ) AS record_[number]
    

    Query

    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 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 7 UNION SELECT 8 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 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
    ) AS record_4
    CROSS JOIN ( SELECT @number := 0 ) AS init_user_param
    

    this SQL statement will be used to split on html tag

    SQL statement

    CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX([large_html_string], ">", [tag_position]), ">", -1), ">") as tag 
    

    The trick now is to combine the number generator and the html string splittig. So the [tag_position] is filled with a number from the number generator.
    This is done with a CROSS JOIN.

    Query

    SELECT 
     *
    FROM ( 
    
      SELECT 
        CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(data, ">", generator.number), ">", -1), ">") as tag 
      FROM (
    
        SELECT '

    C10373 - FIAT GROUP AUTOMOBILES/RAMO DI AZIENDA DI KUEHNE + NAGEL

    la 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 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 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 7 UNION SELECT 8 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 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 != '>'

    see demo http://www.sqlfiddle.com/#!9/de2ed/32

    Now we have the tags as separated records it really eazy to replace only with in records that contain "href".

    SQL statement

     (
        CASE 
          WHEN 
            LOCATE("href", tags.tag) > 0
          THEN 
            REPLACE(tags.tag, "+", " ") 
          ELSE 
            tags.tag
        END
     ) AS tag
    

    see demo http://www.sqlfiddle.com/#!9/de2ed/38

    Now that we know how to replace now we are going to merge the records back to one string. We can use GROUP_CONCAT for that.

    Query

        SET SESSION group_concat_max_len = @@max_allowed_packet;
    
        SELECT 
         GROUP_CONCAT(
            CASE 
              WHEN 
                LOCATE("href", tags.tag) > 0
              THEN 
                REPLACE(tags.tag, "+", " ") 
              ELSE 
                tags.tag
            END
           SEPARATOR ""
         ) AS html
    
        FROM ( 
    
          SELECT 
            CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(data, ">", generator.number), ">", -1), ">") as tag 
          FROM (
    
            SELECT '

    C10373 - FIAT GROUP AUTOMOBILES/RAMO DI AZIENDA DI KUEHNE + NAGEL

    la 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 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 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 7 UNION SELECT 8 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 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 != '>'

    see demo for the complete query

    http://www.sqlfiddle.com/#!9/de2ed/46

    0 讨论(0)
提交回复
热议问题