我有一个函数返回jsonb

SELECT get_my_records( 'some', 'args' );
get_my_records
{ "a": 1, "b": 3.14 }
{ "a": 2, "b": 2.71 }
...

并try 使用jsonb_to_record()将记录转换为

a b
1 3.14
2 2.71
... ...

已try

SELECT * 
FROM jsonb_to_record( val ) as x( a int, b double precision ) 
FROM get_my_records( 'some', 'arg' ) AS val;`

还有几个变种,但都没有成功.我们该怎么做呢?

(可能缺乏适当的术语来从网络搜索中获得有意义的结果)

推荐答案

您的try 基本上是正确的,但您出于某种原因添加了多个FROM列表,这是不允许的.如果你用->> accessors来代替demo,你可以用一个FROM来代替:

select (j->>'a')::int as a, 
       (j->>'b')::double precision as b 
from get_my_records( 'some', 'args' ) as jdata(j);
a b
1 3.14
2 2.71

您不能在一个查询中包含多个from个列表--您必须将其拆分为CTE/subqueries

SELECT * 
FROM jsonb_to_record( val ) as x( a int, b double precision ) 
FROM get_my_records( 'some', 'arg' ) AS val;
ERROR:  syntax error at or near "FROM"
LINE 4: FROM get_my_records( 'some', 'arg' ) AS val;
        ^

或者,你也可以把你的from条 list 增加joining the sources条:

SELECT x.* 
FROM get_my_records( 'some', 'arg' ) AS val 
LEFT JOIN LATERAL jsonb_to_record(val) as x(a int,b double precision) ON TRUE;
a b
1 3.14
2 2.71

您可以使用逗号,来隐式联接,因为lateral是由这些伪装成源的集合返回函数之间的依赖关系暗示的,而on true只是允许它们自由联接.

SELECT x.* 
FROM get_my_records( 'some', 'arg' ) AS val,
     jsonb_to_record( val ) as x( a int, b double precision );

Sql相关问答推荐

如何在VB.NET中使用MS SYS根据开始和结束期间日期进行查询

Oracle SQL中的累计总数

有没有一种正确的方法来利用SQL UNION来从三个潜在查询中 Select 最大值?

连接特定行号

计算周时出现SQL错误结果

SQL:如何将相应位置的两个数组中的元素组合在一起

将一个数组反嵌套到另外两个数组SQL中(Athena/presto)

TSQL如何为群分配号码

用VB.NET在Dapper中实现MS Access数据库顺序透视

显示十进制列,但尽可能显示为整数

从给定数据中查找下一个工作日期

同时插入和更新记录

如何在 SQL 中将两行(或多行)jsonb 数组合并为一行

验证某个日期前后的连续代码

SQL:无重复项的两个聚合函数

try 将多行折叠为单个结果

如何对 SQL 表中的连续时间戳进行分组?

T-SQL 查询计算日期在其他列中定义的日期之间绑定的行数

如何使用子查询锁定此查询中的选定行?

Lag() 获取snowflake的值变化