使用Postgres 12,以下内容将返回一个int JSON表示:
> SELECT to_json(2::int)
.. 2
而如果类型是oid
,它将以字符串形式返回:
> SELECT to_json(2::oid)
.. "2"
由于oid本质上是一个int值,所以我希望它可以这样表示。我尝试在oid
与text
和json
类型之间创建一个强制转换,但似乎都没有被to_json
接受。
除了显式地将每个oid列强制转换为int之外,有没有一种方法可以使to_json
将oid
表示为int
?
您将不得不使用显式强制转换,因为PostgreSQL将oid
视为字符串是硬编码的。
您可以向pgsql黑客邮件列表建议以下补丁:
diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c
index 30ca2cf6c8..09e9a9ac08 100644
--- a/src/backend/utils/adt/json.c
+++ b/src/backend/utils/adt/json.c
@@ -170,6 +170,7 @@ json_categorize_type(Oid typoid,
case FLOAT4OID:
case FLOAT8OID:
case NUMERICOID:
+ case OIDOID:
getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
*tcategory = JSONTYPE_NUMERIC;
break;
diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c
index 8d1e7fbf91..0e8edb0fc3 100644
--- a/src/backend/utils/adt/jsonb.c
+++ b/src/backend/utils/adt/jsonb.c
@@ -650,6 +650,7 @@ jsonb_categorize_type(Oid typoid,
case FLOAT4OID:
case FLOAT8OID:
case NUMERICOID:
+ case OIDOID:
getTypeOutputInfo(typoid, outfuncoid, &typisvarlena);
*tcategory = JSONBTYPE_NUMERIC;
break;
这将改变行为,我不明白为什么补丁不应该被接受。
您可以通过在公共模式中创建一个同名函数来覆盖to_json,该函数为您执行强制转换。
CREATE FUNCTION public.to_json(IN prm oid) RETURNS json
LANGUAGE SQL AS
$body$
SELECT pg_catalog.to_json(prm::int);
$body$;