默认允许的数据类型转换矩阵

Pet*_*ier 6 postgresql datatypes documentation type-conversion

今天我想定义一个 uuid 的 value 00000000-0000-0000-0000-000000000000。作为一名 SQL Server 人员,我通常会...

select cast(0x0 as uniqueidentifier);
Run Code Online (Sandbox Code Playgroud)

...但我现在在 postgres 世界中,所以我提出了一个明智的...

select cast('\x00'::bytea as uuid);
Run Code Online (Sandbox Code Playgroud)
ERROR:  cannot cast type bytea to uuid
LINE 1: select cast('\x00'::bytea as uuid);
               ^
Run Code Online (Sandbox Code Playgroud)

该死!所以我头部到对类型转换的Postgres文档希望看到像DOC这一个来审查,数据类型,我可以通过与默认情况下,无需施展创造一个显式类型转换

sql-server-implicit-explicit-conversion-matrix

如果文档中确实存在这样的图表,那么它就会被很好地隐藏起来。谷歌在这方面也不是很有帮助。

是否有关于 postgresql 中默认允许的类型转换的良好文档参考?


需要明确的是,我实际上并不关心 uuid

Lau*_*lbe 11

您可以使用psql客户端获取列表

\dCS
Run Code Online (Sandbox Code Playgroud)

这将显示系统数据类型之间定义的所有强制转换。

此外,所有类型都可以text使用类型输入和输出函数进行转换。


Pet*_*ier 10

作为Laurenz帖子的补充......

文档

\dC[+] [ pattern ]

列出类型转换。如果指定了模式,则仅列出源或目标类型与模式匹配的强制转换。如果将 + 附加到命令名称,则列出每个对象及其相关描述。

\set ECHO_HIDDEN on显示\dCS+正在执行...

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;
Run Code Online (Sandbox Code Playgroud)

...这为我们提供了一些更有趣的文档页面。