PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

postgresql:enum e caractere variando, atualizando


O problema com uma simples tentativa é que você tem um elenco chamando o elenco, chamando o elenco, chamando o elenco...

Você precisa de alguma forma se afastar de varchar->enum em seu elenco. A maneira mais simples (mais compreensível) é apenas converter manualmente. Observe que os literais de string sendo convertidos na instrução case não são texto, eles são do tipo entre aspas desconhecido, o que evita a recursão 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;