使用LOOP替代UNION ALL解析JSON数组元素至行的问题
替代多次UNION ALL解析JSON数组的方案
直接用PostgreSQL内置的json_array_elements函数即可一次性展开JSON数组,无需重复写UNION ALL或手动循环,代码简洁且高效:
SELECT e.id AS execution_entry_id, account AS account_json, account->>'startBalance' AS startBalance, account->>'endBalance' AS endBalance FROM stage_cz.cb_data_execution_entry e LEFT JOIN stage_cz.cb_data_execution_entry_details d ON d.execution_entry_id = e.id LEFT JOIN LATERAL json_array_elements((e.response_body::json)->'statements') AS account ON true WHERE provider_name = 'sokordiatech' AND account IS NOT NULL;
你的LOOP代码报错原因
PL/pgSQL块中直接执行SELECT但未指定结果的接收目标(比如INTO变量或返回结果集),PostgreSQL无法处理查询结果,因此抛出query has no destination for result data错误。即便改成PERFORM也只是丢弃结果,无法合并循环结果返回,这种方式完全没必要。
方案优势
- 无需手动编写多次重复的UNION ALL代码,避免遗漏数组元素
json_array_elements自动遍历JSON数组的所有元素,适配任意长度的数组- 使用
->>运算符直接获取不带引号的文本值,省去trim和类型转换的冗余操作
内容的提问来源于stack exchange,提问作者Lukáš Horník
相关产品推荐
相关产品推荐

