web-dev-qa-db-fra.com

matrice de conversion de type de données autorisée par défaut

Aujourd'hui, je voulais définir un uuid de valeur 00000000-0000-0000-0000-000000000000. En tant qu'homme SQL Server, je généralement ...

select cast(0x0 as uniqueidentifier);

... mais je suis dans le monde postgres maintenant donc j'ai fouetté un sensible ...

select cast('\x00'::bytea as uuid);
ERROR:  cannot cast type bytea to uuid
LINE 1: select cast('\x00'::bytea as uuid);
               ^

Zut! Je me dirige donc vers les documents postgres sur la conversion de type en espérant voir un document comme celui-ci pour examiner les types de données que je peux convertir entre par défaut sans avoir besoin de créer une distribution explicite .

sql-server-implicit-explicit-conversion-matrix

Si un tel graphique existe dans les documents, il est bien caché. Google n'est pas non plus super utile à cet égard.

Existe-t-il une bonne référence de documentation pour les conversions de types autorisés par défaut dans postgresql?


Pour être clair, je ne me soucie pas vraiment de l'uuid

5
Peter Vandivier

Vous pouvez obtenir une liste en utilisant le client psql avec

\dCS

Cela montrera toutes les conversions définies entre les types de données système.

De plus, tous les types peuvent être convertis vers et depuis text à l'aide des fonctions d'entrée et de sortie de type.

9
Laurenz Albe

En complément de poste de Laurenz ...

De les docs :

\dC[+] [ pattern ]

Répertorie les transtypages. Si le modèle est spécifié, seuls les transtypages dont les types source ou cible correspondent au modèle sont répertoriés. Si + est ajouté au nom de la commande, chaque objet est répertorié avec sa description associée.

\set ECHO_HIDDEN on Révèle que \dCS+ Est en cours d'exécution ...

SELECT pg_catalog.format_type(castsource, NULL) AS "Source type",
       pg_catalog.format_type(casttarget, NULL) AS "Target type",
       CASE WHEN c.castmethod = 'b' THEN '(binary coercible)'
            WHEN c.castmethod = 'i' THEN '(with inout)'
            ELSE p.proname
       END AS "Function",
       CASE WHEN c.castcontext = 'e' THEN 'no'
            WHEN c.castcontext = 'a' THEN 'in assignment'
            ELSE 'yes'
       END AS "Implicit?",
       d.description AS "Description"
FROM pg_catalog.pg_cast c LEFT JOIN pg_catalog.pg_proc p
     ON c.castfunc = p.oid
     LEFT JOIN pg_catalog.pg_type ts
     ON c.castsource = ts.oid
     LEFT JOIN pg_catalog.pg_namespace ns
     ON ns.oid = ts.typnamespace
     LEFT JOIN pg_catalog.pg_type tt
     ON c.casttarget = tt.oid
     LEFT JOIN pg_catalog.pg_namespace nt
     ON nt.oid = tt.typnamespace
     LEFT JOIN pg_catalog.pg_description d
     ON d.classoid = c.tableoid AND d.objoid = c.oid AND d.objsubid = 0
WHERE ( (true  AND pg_catalog.pg_type_is_visible(ts.oid)
) OR (true  AND pg_catalog.pg_type_is_visible(tt.oid)
) )
ORDER BY 1, 2;

... ce qui nous amène à quelques pages de documentation plus intéressantes.

8
Peter Vandivier