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;
Archivos de Categoría: Base de datos - Paginas 5
Cursor en MySQL
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;