Archivos de Categoría: Base de datos - Paginas 5

Cursor en MySQL

DELIMETER$$
CREATE PROCEDURE actualiza_provincias()   
BEGIN
 	DECLARE v_finished INTEGER DEFAULT 0;
    DECLARE _id, _new_id INTEGER ;
    
 
    DEClARE prov_cursor CURSOR FOR 
    	SELECT id_provincia, new_id FROM provincias;
 
  
    DECLARE CONTINUE HANDLER
        FOR NOT FOUND SET v_finished = 1;
 
    OPEN prov_cursor;
 
    get_prov: LOOP
 
        FETCH prov_cursor INTO _id, _new_id;
 
        IF v_finished = 1 THEN
            LEAVE get_prov;
        END IF;
 
// el update o lo que sea
 
    END LOOP get_prov;
 
    CLOSE prov_cursor;
 
END$$
DELIMETER;

Calcular distancias entre puntos geoposicionados con MySQL

Me ha tocado montar un buscador mostrando la distancia entre dos puntos geoposicionados así que googleando un poco me he encontrado con esta función que va bastante bien:

CREATE FUNCTION `geodistkm`(
        lat1  FLOAT ,
        lon1  FLOAT,
        lat2 FLOAT ,
        lon2 FLOAT
    )
    RETURNS float
    NOT DETERMINISTIC   
BEGIN
	 DECLARE pi, q1, q2, q3 FLOAT;
	 DECLARE rads FLOAT DEFAULT 0;
	 SET pi = PI();
	 SET lat1 = lat1 * pi / 180;
	 SET lon1 = lon1 * pi / 180;
	 SET lat2 = lat2 * pi / 180;
	 SET lon2 = lon2 * pi / 180;
	 SET q1 = COS(lon1-lon2);
	 SET q2 = COS(lat1-lat2);
	 SET q3 = COS(lat1+lat2);
	 SET rads = ACOS( 0.5*((1.0+q1)*q2 - (1.0-q1)*q3) ); 
	 RETURN 6378.388 * rads;
END;

Comparar dos cadenas en MySQL con posibles valores null

En un proceso de importación que acabo de terminar de montar, me toca comprobar si un usuario está registrado y como no tenemos DNI toca hacerlo comprobando si el nombre y los apellidos coinciden. No es que sea muy de fiar pero el cliente es lo que pide….
El problema es que el nombre y los apellidos están en tres campos distintos por lo que toca concatenarlos.

SELECT CONCAT(NOMBRE,APELLIDO1,APELLIDO2) FROM tabla;

Primer problema, lo más normal es que la gente meta un espacio ya sea porque se le escape o porque al importarlo lo ha cogido asi que hacemos un concat pero esta vez eliminando los espacios

SELECT REPLACE(CONCAT(NOMBRE,APELLIDO1,APELLIDO2) ), ' ', '') FROM tabla;

Pero claro, si uno de los campos está a null falla fijo así que lo que hacemos es comprobar antes de concatenar si el campo está a null para sustituirlo por un espacio

SELECT REPLACE(CONCAT(COALESCE(NOMBRE,''), COALESCE(APELLIDO1,''), COALESCE(APELLIDO2,'')) ), ' ', '') FROM tabla;

Todo esto claro está, teniendo en cuenta que la base de datos está configurada para que no distinga acentos ni mayúsculas porque si no ya toca rizar el rizo:

SELECT UPPER(REPLACE(CONCAT(COALESCE(NOMBRE,''), COALESCE(APELLIDO1,''), COALESCE(APELLIDO2,'')) ), ' ', '')) FROM tabla COLLATE utf8_bin;