【发布时间】: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 谢谢 :-) 我在搜索过程中不知何故错过了那个。我已将问题标记为重复。
标签: json postgresql row postgresql-9.4