¿Cómo puedo agregar una coma después de cada letra si todos mis registros tienen letras aleatorias?

Lo que tengo:

1. AHGJTOSIYGJ
2. OTPDBSKGY
3. HFRYEC
4. OPFKWIFS
// etc

Lo que necesito:

1. A, H, G, J, T, O, S, I, Y, G, J,
2. O, T, P, D, B, S, K, G, Y,
3. H, F, R, Y, E, C,
4. O, P, F, K, W, I, F, S,
// etc
1
Tauras 25 ago. 2016 a las 12:13

2 respuestas

La mejor respuesta

Estas operaciones deben realizarse a través del nivel de aplicación, no por DB. Sin embargo, si realmente desea hacer esto desde el nivel de base de datos, puede hacerlo fácilmente utilizando la función definida por el usuario. Aquí hay una función para hacer esto

delimiter //

create function myFunction(myString varchar(255)) 
returns varchar(255)
begin
 declare strLen int ;
 declare lookupChar char(1);
 declare finalString varchar(255);
 declare x int;

 set strLen = length(myString);
 set x = 1 ;
 set finalString = '';
 while x <= strLen do
   set lookupChar = substring(myString,x,1);
   if finalString = '' then 
     set finalString = lookupChar;
   else 
     set finalString = concat(finalString,',',lookupChar);
   end if;
   set x = x+1;
 end while;
 return finalString;
end//

delimiter;

Ejecutemos esto en mysql

mysql> create table mytable (id int, value varchar(100));
Query OK, 0 rows affected (0.19 sec)

mysql> insert into mytable values (1,'AHGJTOSIYGJ'),(2,'OTPDBSKGY'),(3,'HFRYEC'),(4,'OPFKWIFS');
Query OK, 4 rows affected (0.02 sec)

mysql> select * from mytable ;
+------+-------------+
| id   | value       |
+------+-------------+
|    1 | AHGJTOSIYGJ |
|    2 | OTPDBSKGY   |
|    3 | HFRYEC      |
|    4 | OPFKWIFS    |
+------+-------------+
4 rows in set (0.00 sec)

Creemos ahora la función

mysql> delimiter //
mysql> create function myFunction(myString varchar(255)) 
    -> returns varchar(255)
    -> begin
    ->  declare strLen int ;
    ->  declare lookupChar char(1);
    ->  declare finalString varchar(255);
    ->  declare x int;
    -> 
    ->  set strLen = length(myString);
    ->  set x = 1 ;
    ->  set finalString = '';
    ->  while x <= strLen do
    ->    set lookupChar = substring(myString,x,1);
    ->    if finalString = '' then 
    ->      set finalString = lookupChar;
    ->    else 
    ->      set finalString = concat(finalString,',',lookupChar);
    ->    end if;
    ->    set x = x+1;
    ->  end while;
    ->  return finalString;
    -> end//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

Hasta ahora todo bien, ahora seleccionemos los valores usando la función

mysql> select id,myFunction(value) as value from mytable ;
+------+-----------------------+
| id   | value                 |
+------+-----------------------+
|    1 | A,H,G,J,T,O,S,I,Y,G,J |
|    2 | O,T,P,D,B,S,K,G,Y     |
|    3 | H,F,R,Y,E,C           |
|    4 | O,P,F,K,W,I,F,S       |
+------+-----------------------+

Puede hacer esto para toda la tabla y también puede hacer la actualización fácilmente si es necesario.

3
Abhik Chakraborty 25 ago. 2016 a las 10:01

Necesitamos una tabla de trabajo de números de secuencia desde 1 hasta cadenas de entrada de longitud máxima:

create table seqnum(X int not null, primary key(X));
insert into seqnum values(1),(2),(3),(4);
insert into seqnum select X+4 from seqnum;
insert into seqnum select X+8 from seqnum;
insert into seqnum select X+16 from seqnum;
insert into seqnum select X+32 from seqnum;

Tabla de prueba:

create table test6(id int, lett varchar(100));
insert into test6 values(1,'AHGJTOSIYGJ'),(2,'OTPDBSKGY'),(3,'HFRYEC'),(4,'OPFKWIFS');

Consulta para seleccionar letras cambiadas en la tabla test6:

select id, lett, group_concat(substr(lett,S.X,1) ORDER BY T.id, S.x SEPARATOR ', ')
  from test6 T, seqnum S
 where S.X<=length(T.lett)
 group by id

Resultado:

1 | AHGJTOSIYGJ | A, H, G, J, T, O, S, I, Y, G, J
2 | OTPDBSKGY   | O, T, P, D, B, S, K, G, Y
3 | HFRYEC      | H, F, R, Y, E, C
4 | OPFKWIFS    | O, P, F, K, W, I, F, S

Para actualizar los valores de la tabla existente, use la consulta:

update test6 A
  join (
        select id, group_concat(substr(lett,S.X,1) ORDER BY T.id, S.x SEPARATOR ', ') new
          from test6 T, seqnum S
         where S.X>0 and S.X<=length(T.lett)
         group by id
       ) B ON A.id=B.id
   set A.lett=B.new

Prueba en sqlfiddle.com

1
Mike 25 ago. 2016 a las 10:08