MySQL - Consulta basica!

   
Vista:
Imágen de perfil de Miguel Angel

Consulta basica!

Publicado por Miguel Angel (4 intervenciones) el 03/10/2017 23:13:49
Buena cabros,


Necesito unos consejos, tengo una tabla con 3 campos el cual uno de ellos guarda una cadena string, de esa cadena quiero extraer 3 números. ya tengo la query lista, pero encuentro que no es la mejor forma de hacerlo y consumirá mucho tiempo de ejecución cuando tenga muchos registros. :(

1-Existirá alguna mejor forma de hacerlo?
2-Lo otro, podre dejar esos 3 numero en un nueva tabla al momento que ingresen datos a esa tabla
(Algo como un gatillador)


Tabla
eje1

Campo strg
1
2
3
4
866.683,oo
637.785,oo
228.898,oo
","ErrorMessage":"","ErrorDetails":""}],"OCRExitCode":1,"IsErroredOnProcessing":false,"ErrorMessage":null,"ErrorDetails":null,"ProcessingTimeInMillis

Mi desastrosa query xD
1
2
3
4
SELECT strg,LTRIM( REPLACE(  SUBSTRING_INDEX(strg,',',1), '.', '')) AS part1,
REPLACE(SUBSTRING(SUBSTRING_INDEX(SUBSTRING_INDEX(strg,',',2),',',-1), -7),'.', '') AS part2,
REPLACE(SUBSTRING(SUBSTRING_INDEX(SUBSTRING_INDEX(strg,',',3),',',-1), -7),'.', '') AS part3
FROM stotalcount

Respuesta
2

De ante mano gracias :)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Consulta basica!

Publicado por leonardo_josue (300 intervenciones) el 04/10/2017 21:21:16
Hola Miguel Ángel:

1
1-Existirá alguna mejor forma de hacerlo?

En realidad creo que lo que haces está bien... otra forma de hacerlo podría ser implementando una función, pero no creo que en realidad puedas mejorar mucho el rendimiento de la consulta.

1
2
2-Lo otro, podre dejar esos 3 numero en un nueva tabla al momento que ingresen datos a esa tabla
(Algo como un gatillador)

Si, puedes utilizar un TRIGGER para insertar un nuevo registro en otra tabla o en su defecto, hacer algunas modificaciones a los valores para insertar la información que necesitas por separado, es decir, algo como esto, puedes tener la misma tabla, pero con los campos que te interesa por separado:

1
2
3
4
5
6
7
8
mysql> CREATE TABLE tabla (
    ->   id INT, strg VARCHAR(1000),
    ->   fecha DATE,
    ->   part1 VARCHAR(20),
    ->   part2 VARCHAR(20),
    ->   part3 VARCHAR(20)
    -> );
Query OK, 0 rows affected (0.34 sec)

Con un TRIGGER BEFORE INSERT, puedes realizar los mismos cálculos que estás haciendo para obtener las partes que te interesan:

1
2
3
4
5
6
7
8
9
10
11
mysql> DELIMITER $$
mysql> CREATE
    ->     TRIGGER `pruebas`.`obtener_valores` BEFORE INSERT
    ->     ON `pruebas`.`tabla`
    ->     FOR EACH ROW BEGIN
    ->       SET NEW.part1 = REPLACE(SUBSTRING_INDEX(NEW.strg,',oo',1), '.', '');
    ->       SET NEW.part2 = REPLACE(SUBSTRING(SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.strg,',',2),',',-1), -7),'.', '');
    ->       SET NEW.part3 = REPLACE(SUBSTRING(SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.strg,',',3),',',-1), -7),'.', '');
    ->     END$$
Query OK, 0 rows affected (0.12 sec)
mysql> DELIMITER ;

De tal suerte, que al insertar un nuevo registro, sólo envías el id, la cadena y la fecha y el TRIGGER separa lo que necesites:

1
2
3
4
5
6
7
8
9
10
11
mysql> INSERT INTO tabla (id, strg, fecha) VALUES
    -> (1, "866.683,oo 637.785,oo 228.898,oo \",\"Error\":\"", '2019-09-24');
Query OK, 1 row affected (0.08 sec)
 
mysql> SELECT * FROM tabla;
+------+----------------------------------------------+------------+--------+--------+--------+
| id   | strg                                         | fecha      | part1  | part2  | part3  |
+------+----------------------------------------------+------------+--------+--------+--------+
|    1 | 866.683,oo 637.785,oo 228.898,oo ","Error":" | 2019-09-24 | 866683 | 637785 | 228898 |
+------+----------------------------------------------+------------+--------+--------+--------+
1 row in set (0.00 sec)

Obviamente tendrías que agregar algunas validaciones al TRIGGER para asegurarte de que tus cálculos funcionan, pero eso ya forma parte de tu lógica de negocio.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Miguel Angel

Consulta basica!

Publicado por Miguel Angel (4 intervenciones) el 05/10/2017 18:05:31
Si eso pensé, no hay mejor forma pero me dedique a trabajar en el programa que inserta los datos y lo mejore bastante para no dejarle todo el trabajo a la consulta!

y lo del TRIGGER me parece muy pero muy bueno es lo que busco! muchas gracias por tu tiempo leonardo_josue luego te cuento como me fue :)

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar