如何在 PostgreSQL 中创建一个 oid 类型的转换?
How to create a cast to oid type in PostgreSQL?
我需要将 decimal/numeric 数据类型隐式转换为 oid 类型,以便在查询的 where 部分使用 = 运算符而不添加 :: 符号。
阅读此处的文档后https://www.postgresql.org/docs/11/sql-createcast.html我尝试添加此转换,但它仅适用于 0 到 +2147483647 oid,因为 PostgreSQL 中的 int4 是有符号的,而 oid 类型是无符号的
CREATE CAST (numeric AS oid) WITH FUNCTION int4(numeric) AS IMPLICIT;
我知道 oid 已被弃用且不被推荐,并且在 PostgreSQL 12 中也有关于它们的重大更改,但我现在确实需要这个解决方法。
您应该使用类型输入和输出函数来定义该转换:
CREATE CAST (numeric AS oid) WITH INOUT AS IMPLICIT;
这将正确处理错误。
请注意,在系统类型上添加隐式转换可能会破坏类型解析系统的稳定性,因此您会收到有关歧义的错误。对于 oid
,这可能不是什么大问题。
另外,oid
在 PostgreSQL v12 中没有弃用。去掉的是oid
作为隐藏系统栏目使用
我需要将 decimal/numeric 数据类型隐式转换为 oid 类型,以便在查询的 where 部分使用 = 运算符而不添加 :: 符号。
阅读此处的文档后https://www.postgresql.org/docs/11/sql-createcast.html我尝试添加此转换,但它仅适用于 0 到 +2147483647 oid,因为 PostgreSQL 中的 int4 是有符号的,而 oid 类型是无符号的
CREATE CAST (numeric AS oid) WITH FUNCTION int4(numeric) AS IMPLICIT;
我知道 oid 已被弃用且不被推荐,并且在 PostgreSQL 12 中也有关于它们的重大更改,但我现在确实需要这个解决方法。
您应该使用类型输入和输出函数来定义该转换:
CREATE CAST (numeric AS oid) WITH INOUT AS IMPLICIT;
这将正确处理错误。
请注意,在系统类型上添加隐式转换可能会破坏类型解析系统的稳定性,因此您会收到有关歧义的错误。对于 oid
,这可能不是什么大问题。
另外,oid
在 PostgreSQL v12 中没有弃用。去掉的是oid
作为隐藏系统栏目使用