sql - 创建“子记录”类型保留列名称的最优雅方法
问题描述
所以我在玩 Postgres' composite types
,但我无法弄清楚一件事。假设我想使用某个表的列的子集,或者混合查询中使用的几个不同表的不同列,并从中创建一个记录类型。
从逻辑上讲, simple(c.id, c.name)
应该可以工作,但似乎列名实际上丢失了 - 无法通过name
and来寻址记录的字段id
,例如,to_json
在从该记录创建 json 时,函数不能使用字段名。(select c.id, c.name)
可以预见,使用子查询会因subquery must return only one column
错误而失败。
当然,我可以使用横向连接或公用表表达式来创建这种子类型,但我在想——如果有更优雅的方式吗?
参见表db<>fiddle demo
示例和测试查询
create table test(id integer, name text, price int);
insert into test(id,name,price)
values
(1,'name1',1),
(2,'name2',12),
(3,'name3',23),
(5,'name5',4),
(9,'name9',3);
create type sub_test as (id integer, name text);
select
c.price,
-- using predefined type - works
to_json((c.id, c.name)::sub_test),
-- creating row type on the fly - doesn't work, names are lost
to_json((c.id, c.name)),
-- using derived table created with lateral join - works
to_json(d)
from test as c, lateral(select c.id, c.name) as d
解决方案
推荐阅读
- r - dplyr if_else,如果为假,则引用数据集中的另一列
- javascript - npm python-shell 不适用于电子
- javascript - 使用分页将 Ajax 控制器调用的结果分配给 select2
- r - R Studio错误:要替换的项目数不是替换长度的倍数
- algorithm - 给定两个集合,其元素数量分别为 a , b 。任何子集都可以有来自 A 的 2 个元素和来自 B 的 1 个元素,反之亦然
- regex - 带有多个正则表达式的 Kotlin .split()
- java - 如何返回另一个类调用的数组?
- android - 为什么我在线程中收到 java.lang.NullPointerException 错误?
- android - 长时间运行的低功耗蓝牙操作,在 Android 上无阻塞
- python - 使用python浏览目录?