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

postgresql:enumeración y carácter variable, actualización

El problema con un simple intento es que tienes un elenco llamando al elenco, llamando al elenco, llamando al elenco...

Necesita de alguna manera alejarse de varchar->enum en su elenco. La forma más simple (la más comprensible) es simplemente convertir manualmente. Tenga en cuenta que los literales de cadena que se emiten en la declaración de caso no son texto, son de tipo desconocido entre comillas, lo que elude la recursividad infinita.

BEGIN;

CREATE TYPE t_tl AS ENUM ('red', 'amber', 'green');

CREATE FUNCTION dummy_cast(varchar) RETURNS t_tl AS $$
    SELECT CASE $1
        WHEN 'red' THEN 'red'::t_tl
        WHEN 'amber' THEN 'amber'::t_tl
        WHEN 'green' THEN 'green'::t_tl
    END;
$$ LANGUAGE SQL;

CREATE CAST (varchar AS t_tl) WITH FUNCTION dummy_cast(varchar) AS ASSIGNMENT;

CREATE TABLE t (x t_tl);

INSERT INTO t VALUES ('red');
INSERT INTO t VALUES ('green'::varchar);

SELECT * FROM t;

ROLLBACK;