sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL:¿Existe una función que convierta un int de base 10 en una cadena de base 36?

Hay funciones de base 64 (como encode ) pero nada para base-36. Pero podría escribir uno propio o usar este :

CREATE OR REPLACE FUNCTION base36_encode(IN digits bigint, IN min_width int = 0) RETURNS varchar AS $$
DECLARE
    chars char[]; 
    ret varchar; 
    val bigint; 
BEGIN
    chars := ARRAY['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
    val := digits; 
    ret := ''; 
    IF val < 0 THEN 
        val := val * -1; 
    END IF; 
    WHILE val != 0 LOOP 
        ret := chars[(val % 36)+1] || ret; 
        val := val / 36; 
    END LOOP;

    IF min_width > 0 AND char_length(ret) < min_width THEN 
        ret := lpad(ret, min_width, '0'); 
    END IF;

    RETURN ret;
END;
$$ LANGUAGE plpgsql IMMUTABLE;

Creo que debería preguntarse si la base de datos es el lugar adecuado para manejar este tipo de formato de datos, sin embargo, los problemas de presentación como este podrían manejarse mejor más cerca del nivel de visualización final de su pila.