PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

postgresql:Aufzählung und Zeichen variieren, aktualisieren

Das Problem bei einem einfachen Versuch ist, dass Sie einen Cast haben, der den Cast aufruft, den Cast aufruft, den Cast aufruft...

Sie müssen irgendwie von varchar->enum in Ihrer Besetzung wegkommen. Der einfachste (verständlichste) Weg ist die manuelle Konvertierung. Beachten Sie, dass die Zeichenfolgenliterale, die in der case-Anweisung umgewandelt werden, kein Text sind, sondern vom Typ „Anführungszeichen unbekannt“, wodurch die unendliche Rekursion umgangen wird.

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;