PostgreSQL:具有选择性列的 row_to_json [重复]

Posted

技术标签:

【中文标题】PostgreSQL:具有选择性列的 row_to_json [重复]【英文标题】:PostgreSQL: row_to_json with selective columns [duplicate] 【发布时间】:2016-10-14 11:46:51 【问题描述】:

任务概念和我的问题

使用 Postgres 9.4。我如何将row_to_json(row) 与选择性列(而不是整行)一起使用?我需要在构建 JSON 时从行构造函数中丢弃一列,但还需要保留列名。

限制

    不要对同一个表/cte 使用选择性列选项的自联接 之后不要使用外部函数处理从 json 中删除键

我很清楚我可以编写和使用我自己的函数从 JSON 中删除一个键,或者在 Postgres 9.5 中有用于 JSONB 的 - 运算符。但是,我想在没有额外函数调用的情况下预先执行此操作,我很确定这是可能的。

MVCE 及解释

生成样本数据

CREATE TABLE test_table ( id int, col1 int, col2 int, col3 text );
INSERT INTO test_table VALUES 
  (1, 23, 15, 'Jessica'), (2, 43, 84, 'Thomas');

1) 第一次尝试,简单的row_to_json(row),显然不行:

SELECT id, row_to_json(t) FROM test_table t

我需要从行构造函数中丢弃列 id,而不是在将行解析为 json 时添加它。以上回报:

 id |                  row_to_json
----+-----------------------------------------------
  1 | "id":1,"col1":23,"col2":15,"col3":"Jessica"
  2 | "id":2,"col1":43,"col2":84,"col3":"Thomas"

2) 第二次尝试,明确传递列row_to_json(row(col1, ...))

SELECT id, row_to_json(row(col1, col2, col3)) FROM test_table t

但我丢失了列名(如文档中所述,它全部转换为 fX,其中 X 是一个数字:

 id |           row_to_json
----+----------------------------------
  1 | "f1":23,"f2":15,"f3":"Jessica"
  2 | "f1":43,"f2":84,"f3":"Thomas"

预期输出

预期的输出显然来自 MVCE 中的 (1) 点,但没有 id 键值对:

 id |                  row_to_json
----+-----------------------------------------------
  1 | "col1":23,"col2":15,"col3":"Jessica"
  2 | "col1":43,"col2":84,"col3":"Thomas"

【问题讨论】:

json_build_object('col1', col1, 'col2', col2, 'col3', col3) @a_horse_with_no_name 我知道,谢谢,但我不想全部手动输入 - 我的真实案例场景大约有 100 列 :-) 听起来是升级的好理由 ;) @pozs 谢谢 :-) 我在搜索过程中不知何故错过了那个。我已将问题标记为重复。 【参考方案1】:

似乎创建一个具有所需列名和匹配数据类型的类型,然后将行转换为它就可以了:

CREATE TYPE my_type AS (
  col1 int,
  col2 int,
  col3 text
);

然后通过将行转换添加到定义的类型来更改我的语句:

SELECT id, row_to_json(cast(row(col1, col2, col3) as my_type)) FROM test_table t;

得到预期的输出:

 id |                  row_to_json
----+-----------------------------------------------
  1 | "col1":23,"col2":15,"col3":"Jessica"
  2 | "col1":43,"col2":84,"col3":"Thomas"

但是,有没有什么方法可以在没有额外类型的情况下构建它?

【讨论】:

@a_horse_with_no_name 我相信这会给解决方案增加额外的步骤,因为json_populate_record 将 JSON 作为参数。

以上是关于PostgreSQL:具有选择性列的 row_to_json [重复]的主要内容,如果未能解决你的问题,请参考以下文章

具有动态列名和多个输入列的 PostgreSQL 交叉表

使用 Postgresql 休眠未正确加载具有“文本”数据类型的列的数据

如何编辑我的 postgreSQL 查询以按日期选择几列的最新行

如何从 PostgreSQL 的子查询中选择包含值数组的列?

如何选择与 PostgreSQL 中另一列的最高值的唯一列值对对应的行?

是否可以在 PostgreSQL 中索引数组列的位置?