【问题标题】:Convert oid to json as int instead of string将 oid 转换为 json 作为 int 而不是 string
【发布时间】:2021-03-26 10:57:22
【问题描述】:

使用 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

【问题讨论】:

  • 为什么一开始就使用 OID?
  • @a_horse_with_no_name 我正在开发一个在 pg_catalog 中处理 pg 元数据的项目

标签: sql postgresql


【解决方案1】:

您必须使用显式转换,因为 PostgreSQL 将 oid 视为字符串是硬编码的。

您可以向 pgsql-hackers 邮件列表建议以下补丁:

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;

这会改变行为,我不明白为什么不应该接受补丁。

【讨论】:

  • 虽然我不确定我是否会发布补丁提案(此外,它是你的!),但我能够让它在我需要它像那样工作的开发实例上运行,所以谢谢!
【解决方案2】:

您可以通过在为您执行转换的公共架构中创建一个具有相同名称的函数来覆盖 to_json。

CREATE FUNCTION public.to_json(IN prm oid) RETURNS json 
LANGUAGE SQL AS
$body$
  SELECT pg_catalog.to_json(prm::int);
$body$; 

【讨论】:

  • 这只适用于这个参数,当我在做类似SELECT to_json(typ.*) FROM pg_catalog.pg_type typ的事情时,我需要它来工作
猜你喜欢
  • 2018-04-25
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
相关资源
最近更新 更多