我们正在尝试使用 PostgreSQL 模拟具有“全局主键”的专有数据库。这就是我们想要做的(对于许多表的许多行):
select 'some_table' as table_name, t.*
from some_table t
where id = 1
union all
select 'other_table' as table_name, t.*
from other_table t
where id = 2;
但是,这当然行不通,因为每个表模式都是不同的。我们的 DBA 建议这样做:
select 'some_table' as table_name, jsonb_agg(t.*) as content
from some_table t
where id = 1
union all
select 'other_table' as table_name, jsonb_agg(t.*) as content
from other_table t
where id = 2;
哪个会做到这一点,但我们担心产生/传输的数据量。基本上,每个表的每一行都作为包含在单个数组中的一个 JSONB 对象返回。现在困扰我们的是每行的列名的重复。
我们是否可以根据每个表中列的顺序以某种方式返回每行的 JSONB数组,仅包含值?
您可以从 JSONB 值中提取值并将它们聚合回 JSON 数组
但是你不能依赖数组元素的顺序对应于表中列的顺序。
另一种选择(不使用 JSON)是将整行转换为文本值:
将记录转换为文本应保留表中定义的列顺序。