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

任务概念和我的问题

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

限制

  1. 不要对同一个表/cte 使用选择性列选项的自联接
  2. 之后不要使用外部函数处理从 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 谢谢 :-) 我在搜索过程中不知何故错过了那个。我已将问题标记为重复。

标签: json postgresql row postgresql-9.4


【解决方案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 作为参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2015-11-17
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 2022-01-11
  • 2017-02-10
相关资源
最近更新 更多