How to get values separated by "BR" in MySQL?

1

The idea is simple ... I need to get values from a table (by doing SELECT) that are separated by <BR> from a STRING field and then storing a record in a table, inserting each separation.

Example 1:

Registration:

"Enviado para Cotação por Nemoreni Oliveira em 03-12-2013 13:46:22<br>Cotado por Edimar Nunes Pereira em 03-01-2014 13:52:14<br>"

Expected registry:

"Enviado para Cotação por Nemoreni Oliveira em 03-12-2013 13:46:22"
"Cotado por Edimar Nunes Pereira em 03-01-2014 13:52:14"

Example 2:

Registration:

"Enviado para Cotação por Rosimar da Silva Ribeiro em 09-12-2013 13:17:13<br>Cotado por Edimar Nunes Pereira em 09-12-2013 16:26:21<br><br>Reavaliado por: Edimar Nunes Pereira. Em: 2013-12-27 16:45:05<br>Motivo: incluir o ultimo item da NF na sc  de compra.<br><br>Enviado para Cotação por Rosimar da Silva Ribeiro em 27-12-2013 16:59:39<br>Enviado para Cotação por Rosimar da Silva Ribeiro em 27-12-2013 17:00:24<br>Cotado por Edimar Nunes Pereira em 30-12-2013 08:14:26<br>Enviado para Cotação por Rosimar da Silva Ribeiro em 02-01-2014 14:03:27<br>Cotado por Edimar Nunes Pereira      em 02-01-2014 14:05:23<br>"

Expected registry:

"Enviado para Cotação por Rosimar da Silva Ribeiro em 09-12-2013 13:17:13"
"Cotado por Edimar Nunes Pereira em 09-12-2013 16:26:21"
"Reavaliado por: Edimar Nunes Pereira. Em: 2013-12-27 16:45:05"
"Motivo: incluir o ultimo item da NF na sc  de compra."
"Enviado para Cotação por Rosimar da Silva Ribeiro em 27-12-2013 16:59:39"
"Enviado para Cotação por Rosimar da Silva Ribeiro em 27-12-2013 17:00:24"
"Cotado por Edimar Nunes Pereira em 30-12-2013 08:14:26"
"Enviado para Cotação por Rosimar da Silva Ribeiro em 02-01-2014 14:03:27"
"Cotado por Edimar Nunes Pereira em 02-01-2014 14:05:23"
    
asked by anonymous 13.03.2014 / 19:58

4 answers

4

Replace line breaks with% with%

You can use the <br/> function to do this. Example:

select REPLACE(campo,'\n','<br />') from tabela

Note that I have used REPLACE as a line separator, however this may vary depending on the operating system that sends the data to MySQL.

Demo on Sqlfiddle

Divide the content by breaks

In MySQL there is no function \n or something similar that can transform a single column into several.

There are, however, some palliative solutions with the use of commands with SPLIT , SUBSTRING and LOCATE , as described in this SOEN question and also in MySQL documentation comments .

You can create a procedure that looks for the first occurrence of the line break, get the text before it, and include wherever you want. Put it in a loop and do not even have more items left.

I made a basic example:

CREATE procedure split(texto text)
begin
    declare trecho text;
    declare pos int;
    declare pos_ant int;
    set pos = LOCATE('\n', texto);
    set pos_ant = 1;
    delete from linhas;
    while pos > 0 do

       set trecho = substring(texto, pos_ant, pos - pos_ant);
       if length(trim(trecho)) > 0 then
          insert into linhas (linha) values (trecho);
       end if;

       set pos_ant = pos + 1;
       set pos = LOCATE('\n', texto, pos_ant);

    end while;
    if pos_ant <= length(texto) then
        set trecho = substring(texto, pos_ant, length(texto) - pos_ant + 1);
        if length(trim(trecho)) > 0 then
            insert into linhas (linha) values (trecho);
        end if;
    end if;
end//

See in Sqlfiddle

After seeing the update in the question, I made a new example using SUBSTRING_INDEX :

CREATE procedure split(texto text)
begin
    declare trecho text;
    declare pos int;
    declare pos_ant int;
    set pos = LOCATE('<br>', texto);
    set pos_ant = 1;
    delete from linhas;
    while pos > 0 do

       set trecho = substring(texto, pos_ant, pos - pos_ant);
       if length(trim(trecho)) > 0 then
          insert into linhas (linha) values (trecho);
       end if;

       set pos_ant = pos + 4;
       set pos = LOCATE('<br>', texto, pos_ant);

    end while;
    if pos_ant <= length(texto) then
        set trecho = substring(texto, pos_ant, length(texto) - pos_ant + 1);
        if length(trim(trecho)) > 0 then
            insert into linhas (linha) values (trecho);
        end if;
    end if;
end//

See in Sqlfiddle

Considerations

This type of treatment is most appropriately done in a complete programming language like Java, C #, PHP, Python, and so on. It may be best to create a small program to do the job.

    
13.03.2014 / 21:26
2

Change <br> to \n using the function replace () of mysql

SELECT replace(campo, '<br>', '\n') FROM tabela
    
13.03.2014 / 20:52
1

In SELECT , you can concatenate to the value of the column a string that your application understands as line break ( <br /> or \n ).

In mysql you can do this with CONCAT()

    SELECT CONCAT(a.nome, '<br />') as nome from registros a;
    
13.03.2014 / 20:32
1

If you can create a file on the database server, use SELECT. INTO

SELECT ...
FROM ...
INTO OUTFILE '/tmp/...'
LINES TERMINATED BY '<br>\n'

Then you use the file as input for inserts with LOAD DATA INFILE

LOAD DATA INFILE '/tmp/...'
INTO ...

Warning: untested method

    
15.03.2014 / 13:40