A veces necesitas validar o calcular el dígito verificador directamente en la base de datos. Aquí está la implementación para PostgreSQL y MySQL.
Función en PostgreSQL
CREATE OR REPLACE FUNCTION calcular_dv(cuerpo TEXT) RETURNS TEXT AS $$
DECLARE
serie INT[] := ARRAY[2,3,4,5,6,7];
digitos TEXT[];
suma INT := 0;
i INT;
resto INT;
BEGIN
digitos := regexp_split_to_array(reverse(cuerpo), '');
FOR i IN 1..array_length(digitos, 1) LOOP
suma := suma + digitos[i]::INT * serie[((i-1) % 6) + 1];
END LOOP;
resto := 11 - (suma % 11);
IF resto = 11 THEN RETURN '0';
ELSIF resto = 10 THEN RETURN 'K';
ELSE RETURN resto::TEXT;
END IF;
END;
$$ LANGUAGE plpgsql;
-- Uso
SELECT calcular_dv('12345678'); -- '5'
SELECT * FROM personas WHERE calcular_dv(split_part(rut, '-', 1)) = split_part(rut, '-', 2);
Preguntas frecuentes
¿Es eficiente validar RUTs en SQL?
Para validaciones masivas de datos existentes sí. Para validación en tiempo real en aplicaciones web, es mejor hacerlo en el lenguaje de la aplicación para evitar roundtrips a la base de datos.