Ejemplo CASE MySQL

Sabemos la secuencia de la teoría. ¿Pero cómo manejamos una secuencia CASE con un tipo de dato ENUM como value?

CASE value

WHEN [compare-value]

THEN result [WHEN [compare-value] THEN result ...]

[ELSE result] END,

CASE WHEN [condition]

THEN result

[WHEN [condition]THEN result ...]

[ELSE result]

END

Adjunto un ejemplo de secuencia CASE en MySQL, ya que en su día cuando busqué, no encontré un ejemplo claro.

Primero vamos a suponer que tenemos la siguiente base de datos en MySQL centrándonos en los datos que importan: PK y ENUM.

catalog_filter_id —>  la clave (PK)
article_status —> tipo ENUM.
El resto son date, string, etc.

‘article_status’  que es de tipo ENUM está definido de la siguiente forma:

 

ENUM {‘all’,’operative’,’no_operative’}

 

Al ser un enum, article_status puede ser 1, 2, 3.

Si en lugar de 1, 2, 3 como resultado de la búsqueda queremos que devuelva  ‘Todos’, ‘En vigor’ y ‘Sin vigor’:

«En caso de ser 1 muestra ‘Todos’,

En caso de ser 2 muestra ‘En vigor’,

En caso de ser 3 muestra ‘Sin vigor'»

Entonces la secuencia con CASE queda:

SELECT

catalog_filter_id,

family_from,

family_to,

article_from,

article_to,

case article_status  when 1 then 'Todos'  when 2 then 'En vigor'  when 3 then 'Sin vigor'  end as article_status,

bu.name

FROM catalogs_filters cf  left join business_units bu on cf.business_unit_id=bu.business_unit_id


WHERE

cf.catalog_id = ? and

cf.deleted_date is null



Por si no se ve bien en la misma línea tenemos:

case article_status  
  when 1 then 'Todos'  
  when 2 then 'En vigor'  
  when 3 then 'Sin vigor'  
end as article_status

¿Qué conseguimos?

Que se muestren las cadenas ‘Todos’, ‘En vigor’ y ‘Sin vigor’ del CASE en lugar de los números ‘1’, ‘2’, ‘3’ de article_status.

Conclusión: Los ejemplos me liaban si la sentencia ‘case’ va con ‘end’, hay ‘;’ etc. Con este ejemplo si lo utilizas parecido… tiene que funcionar 😉

Fedback, comentarios, pegas, mejoras, compartir y vivir are welcome

Gracias!!

Anuncio publicitario

Cuándo utilizar el tipo de dato ENUM en bases de datos MySQL

Hasta hace poco. No acostumbraba a utilizar el campo ENUM como tipo de dato en una tabla.

La duda que planeo queda clara en el siguiente ejemplo:

//SIN ENUM


create table 'usuarios'(
          usuario_id INT,
          nombre VARCHAR(100),
          usuario_tipo_id INT
        ) TYPE=innodb;</code>
)

(Siendo usuario_tipo_id una fk a usuario_tipo_id de la tabla inferior).


create table 'usuarios_tipos'(

usuario_tipo_id INT,

descripcion VARCHAR(200)

)

ó


// CON ENUM

create table 'usuarios'(

          usuario_id INT,
          nombre VARCHAR(100),
          tipo ENUM 
        ) TYPE=innodb;</code>
)

¿Cuándo tomar una decisión u otra?

Decisión 1:

  1. El tipo de usuarios es gestionado desde la aplicación.
  2. El tipo de usuarios puede crecer o es incierto
  3. Cuando existe un gran número de tipo de usuarios.
  4. El dato lo muestro por pantalla y es sensible a que el sitio cambie de idioma.

Decisión 2:

  1. Existe un número limitado de tipos de usuario y siempre es el mismo.
  2. Nuestra base de datos ya es suficientemente grande y se nos está complicando bastante.
  3. Cuando no voy a filtrar por ese tipo (por ejemplo porque los voy a mostrar en ventanas diferentes y con una gestión independiente).
  4. Si queremos utilizarlo a estilo booleano, para que no nos olvidemos cual es el verdadero o cuál es el falso (ejemplo:  active ENUM (‘no_active’,’active’)

Error en ejecución MySQL

Cuando estamos desesperados, cuando sabemos que algo oscuro está haciendo MySQL, cuando sospechamos que hay algunas tablas bloqueadas o algún error de memoria en MySQL, en estos casos, aconsejo leer el log de MySQL.

Para ello hace falta ir al servidor donde tenemos instalado mysql.

Entrar en la misma consola de Mysql mediante:

mysql -p

Y activar el log.

set global general_log=ON

desc mysql.general_log;

Para desactivarlo hace falta poner

set global general_log=OFF

En mi caso me fue de gran utilidad!! suerte!!

 

 

 

 

Agregar argumentos para cumplir la ley de protección de datos en una tabla de MySQL

Antes créala y añadimos estos campos

ALTER TABLE `mitabla`
ADD COLUMN `created_by` INT(11) NOT NULL,
ADD COLUMN `creation_date` DATETIME NOT NULL AFTER `created_by`,
ADD COLUMN `modified_by` INT(11) NULL AFTER `creation_date`,
ADD COLUMN `modification_date` DATETIME NULL AFTER `modified_by`,
ADD COLUMN `deleted_by` INT(11) NULL AFTER `modification_date`,
	ADD COLUMN `deleted_date` DATETIME NULL AFTER `deleted_by`;

# En caso de que la tabla no esté vacía, será necesario actualizar los siguientes 
# campos cuyo contenido no puede ser nulo
update mitabla set created_by = 1;

update mitabla set creation_date = now();


ALTER TABLE `mitabla`
 ADD CONSTRAINT `table_fk01` FOREIGN KEY (`created_by`) REFERENCES `users` (`user_id`),
 ADD CONSTRAINT `table_fk02` FOREIGN KEY (`modified_by`) REFERENCES `users` (`user_id`),
 ADD CONSTRAINT `table_fk03` FOREIGN KEY (`deleted_by`) REFERENCES `users` (`user_id`);