MySQL - concatenar usando case

 
Vista:
sin imagen de perfil

concatenar usando case

Publicado por lic.blg (1 intervención) el 27/04/2017 01:35:55
buenas tardes

quiero generar una cadena a partir del numero de campos que pueda encontrar en una tabla quedando asi: 0010000001". cuando llega al numero 9 funciona bien (0010000009), pero a partir del 10 me sale esto: "100010". He revisado mi cóodigo pero no encuentro el problema. Lo dejo a continuación esperando puedan apoyarme:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
BEGIN
	DECLARE lcla VARCHAR(7); 'Para guardar la longitud de una consulta
	DECLARE ncla INTEGER; 'Para guardar cuantos registros ya llevan activos
	DECLARE nuevaclave VARCHAR(10); 'Esta sera la nueva cadena
	SELECT count(clave) INTO ncla FROM expedientes; 'verifico cuantos registros llevan activos
	SELECT length(ncla) INTO lcla; ' de la consulta anterior verifico cuanta longitud tiene
	CASE lcla
		WHEN 1 THEN SELECT concat ('001000000',ncla) INTO nuevaclave;
		WHEN 2 THEN SELECT concat ('00100000'+ncla) INTO nuevaclave;
		WHEN 3 THEN SELECT concat ("0010000"+ncla) INTO nuevaclave;
		WHEN 4 THEN SELECT concat ("001000"+ncla) INTO nuevaclave;
		WHEN 5 THEN SELECT concat ("00100"+ncla) INTO nuevaclave;
		WHEN 6 THEN SELECT concat ("0010"+ncla) INTO nuevaclave; 
	ELSE
		SELECT concat ("001"+ncla) INTO nuevaclave;
	END CASE;
		RETURN nuevaclave;
END

Aclaro que es una funcion a la cual le paso un parametro de tipo entero para saber que numero de expediente voy a afectar.

Desde ya, muchas 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
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

concatenar usando case

Publicado por leonardo_josue (414 intervenciones) el 27/04/2017 20:38:06
Hola lic.blg:

Tienes un pequeño "error" de sintaxis... la función CONCAT recibe 2 o más parámetros separados por comas, sólo en el caso del WHEN 1 lo estas haciendo correctamente:

1
WHEN 1 THEN SELECT concat ('001000000',ncla) INTO nuevaclave;

Observa que en el resto de los casos estás utilizando el operador de suma (+)

1
WHEN 2 THEN SELECT concat ('00100000'+ncla) INTO nuevaclave;

Ahora bien... hay muchas formas de matar una mosca, peor utilizar una escopeta puede resultar demasiado... lo mismo pasa con tu consulta... no hay necesidad de utilizar tantos CASE-WHEN cuando hay funciones que te pueden servir, si entendí correctamente lo que necesitas es que tu clave tenga inicialmente los caracteres 001 y después una cadena de hasta 7 caracteres, con ceros a la izquierda... en lugar de poner todo lo que tienes,lo logras simplemente así:

1
SELECT CONCAT('001', LPAD(AQUI_PONES_TU_CLAVE_INICIAL,7,'0'))

De tal suerte que NO IMPORTA LA LONGITUD DE TU CADENA (siempre que sea menor a 7 caracteres)... la función aplica para todos los casos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mysql> SELECT CONCAT('001', LPAD('1',7,'0')) campo
    -> UNION ALL
    -> SELECT CONCAT('001', LPAD('10',7,'0'))
    -> UNION ALL
    -> SELECT CONCAT('001', LPAD('100',7,'0'))
    -> UNION ALL
    -> SELECT CONCAT('001', LPAD('10000',7,'0'))
    -> UNION ALL
    -> SELECT CONCAT('001', LPAD('100000',7,'0'))
    -> UNION ALL
    -> SELECT CONCAT('001', LPAD('1000000',7,'0'))
    -> UNION ALL
    -> SELECT CONCAT('001', LPAD('10000000',7,'0'));
+------------+
| campo      |
+------------+
| 0010000001 |
| 0010000010 |
| 0010000100 |
| 0010010000 |
| 0010100000 |
| 0011000000 |
| 0011000000 |
+------------+
7 rows in set (0.00 sec)

Observa que en el último de los casos ya la función no sirve pues la cadena de parámetro tiene una longitud de 8 caracteres, esto es lo único que debes cuidar.

Haz la prueba y nos comentas.

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
0
Comentar