PostgreSQL v16是否有SQL Server OPENROWSET的JSON读取等效功能?
PostgreSQL 16读取JSON文件的两种实现方式
PostgreSQL 16不需要必须先通过COPY加载到临时表,它支持直接读取服务器上的JSON文件并解析,同时也保留了COPY到临时表的方案,两种场景各有用处:
一、直接读取并解析JSON文件
利用pg_read_file()读取服务器上的文件内容,再结合JSON处理函数直接解析,等效于SQL Server的OPENROWSET+OPENJSON组合。
注意事项
- 文件必须在PostgreSQL服务器可访问的路径下,默认仅允许读取数据目录(
data_directory)内的文件; - 需要拥有
pg_read_server_files权限(超级用户默认具备,也可通过GRANT pg_read_server_files TO your_user;给普通用户授权)。
示例代码
假设temprj.json存放在PostgreSQL数据目录中,内容格式如下:
[{"id":1,"project_name":"Alpha"},{"id":2,"project_name":"Beta"}]
直接解析的SQL语句:
SELECT * FROM jsonb_to_recordset( pg_read_file('temprj.json')::jsonb ) AS projects(id int, project_name text);
二、通过COPY加载到临时表再解析
如果JSON文件在客户端机器上,或者不想处理服务器文件权限,可以用COPY先导入临时表,再解析数据,这种方式更灵活,对权限要求更低。
示例代码
-- 创建临时表存储原始JSON内容 CREATE TEMP TABLE temp_projects (raw_data jsonb); -- 从本地文件导入(若文件在服务器,路径改为服务器绝对路径,如 '/var/lib/postgresql/16/main/temprj.json') COPY temp_projects FROM '/本地路径/temprj.json'; -- 解析并提取数据 SELECT * FROM temp_projects, jsonb_to_recordset(raw_data) AS t(id int, project_name text);
总结
- 若文件在PostgreSQL服务器上且有权限,直接读取的方式更高效;
- 若文件在客户端或权限受限,COPY到临时表的方案更实用。
内容的提问来源于stack exchange,提问作者ChrisAsi71
相关产品推荐
相关产品推荐

