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 的子查询中选择包含值数组的列?