将oid转换为json作为int,而不是字符串



使用Postgres 12,以下内容将返回一个int JSON表示:

> SELECT to_json(2::int)
.. 2

而如果类型是oid,它将以字符串形式返回:

> SELECT to_json(2::oid)
.. "2"

由于oid本质上是一个int值,所以我希望它可以这样表示。我尝试在oidtextjson类型之间创建一个强制转换,但似乎都没有被to_json接受。

除了显式地将每个oid列强制转换为int之外,有没有一种方法可以使to_jsonoid表示为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$; 

最新更新