Hoy me he visto en la necesidad de obtener Varias fechas de una tabla en PostgreSql y mostrar cada una con un color diferente en un Sistema Web.
Mi primera alternativa era buscar una funcion en PHP que me permitiera generar colores hexadecimales aleatorios, pero como tengo más experiencia en PLPgSql, decidí empezar por ahí.
Primero lo primero: todos sabemos que un color hexadecimal es la presentacion de 3 numeros en el rango de 0-255 convertidos a base 16. Pues bien por ahí es por donde empece: generar un numero aleatorio en el rango de 0 a 255.
SELECT trunc(random() * 255)::INTEGER
Ahora necesitamos una función que convierta un numero de Base 10 a Base 16: Para ello necesitamos la siguiente funcion:
CREATE OR REPLACE FUNCTION b10_b16(digits bigint, min_width integer DEFAULT 0)
RETURNS character varying AS
$BODY$
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'];
val := digits;
ret := '';
IF val < 0 THEN
val := val * -1;
END IF;
WHILE val != 0 LOOP
ret := chars[(val % 16)+1] || ret;
val := val / 16;
END LOOP;
IF min_width > 0 AND char_length(ret) < min_width THEN
ret := lpad(ret, min_width, '0');
END IF;
RETURN ret;
END;
$BODY$
LANGUAGE plpgsql IMMUTABLE
COST 100;
El uso de ésta función es:
SELECT b10_b16(45);
--Devolverá el Dato 2D
SELECT b10_b16(11);
--Devolverá el Dato B
SELECT b10_b16(11,2)
--Devolverá el Dato 0B
Con todo ésto tenemos la Base para generar un color aleatorio:
SELECT '#' ||
b10_b16(trunc(random() * 255)::INTEGER,2) ||
b10_b16(trunc(random() * 255)::INTEGER,2) ||
b10_b16(trunc(random() * 255)::INTEGER,2) AS color
--Devolvera algo así: #69A51D
Y listo!!!
Ya tenemos nuestra función que genera colores hexadecimales ALEATORIAMENTE!!!