PostgreSQL 自动(隐式)类型转换,解决类型不匹配报错问题

隐式类型自动转换

如果有接触过其他数据库,诸如MySQL、Oracle等都是默认对数据类型进行了隐式的转换,在其他数据库varchar等字符串类型和数字可以进行自动的隐式转换,但是PG确没有这么处理,那么有没有办法让PG也实现这个功能呢?答案是肯定的,经过查看官方提供的文档,发现可以通过PG的自定义类型转换定义自己想要的隐式类型转换,下面给大家提供一个简单地示例具体的应用可以去查看官方的文档,场景还是上面的简单场景。

--创建类型转换
--注:创建cast需要有pg_cast系统表的权限
--注:当创建类型转换使用自动隐式转换的话如果出现多个匹配的转换此时pg会因为不知道选择哪一个去处理类型转换而报错,
--如果出现多个隐式自动转换都匹配此时还是需要手动添加转换以达到效果,或者删除多余的类型转换
CREATE CAST (numeric AS varchar) WITH INOUT AS IMPLICIT;
CREATE CAST (varchar AS numeric) WITH INOUT AS IMPLICIT;

权限不足等提示可以先进行以下命令

--ALTER type <类型名> owner TO <用户名>;
ALTER type numeric owner TO dev;
  • 如果想查看自己创建的cast可以用下面的SQL查看 
select 
	c1.typname as "castsource",
	c2.typname as "casttarget",
	t.castcontext,
	t.castmethod
from pg_cast as t
LEFT JOIN pg_type c1 on c1.oid=t.castsource
LEFT JOIN pg_type c2 on c2.oid=t.casttarget
WHERE c1.typname = 'numeric'
  • 删除
--删除类型转换
DROP CAST (varchar as numeric);
DROP CAST (numeric as varchar);

如何只是个别关联可以用函数解决 

a.a1 = b.b1::int8 或者 a.a1::varchar = b.b1

pg_cast 表的说明

参考类型转换

你可能感兴趣的:(postgresql,数据库)