我是Postgres的新手,
我见过许多SQL Server解决方案(存储过程,函数),它们允许将查询结果(无论查询是什么)导出到HTML表格中。
我一直试图在Postgres做同样的事情,但没有找到一个简单的方法。我需要一个带有查询的函数作为返回有效HTML代码的参数。我正在寻找纯粹的SQL解决方案。
答案 0 :(得分:3)
该函数从查询中生成一个简单的html表:
create or replace function html_table (query text)
returns setof text language plpgsql as $$
declare
rec record;
header boolean := true;
begin
return next '<table>';
for rec in
execute format($q$
select row_to_json(q) json_row
from (%s) q
$q$, query)
loop
if header then
return query select
format ('<tr><th>%s</th></tr>', string_agg(key, '</th><th>'))
from json_each(rec.json_row);
header := false;
end if;
return query select
format ('<tr><td>%s</td></tr>', string_agg(value, '</td><td>'))
from json_each_text(rec.json_row);
end loop;
return next '</table>';
end $$;
使用示例:
create temp table test_data (id int, name text, amount int);
insert into test_data values
(1, 'Jim', 10),
(2, 'Ann', 20),
(3, 'Bob', 30);
select html_table('select * from test_data');
html_table
--------------------------------------------------
<table>
<tr><th>id</th><th>name</th><th>amount</th></tr>
<tr><td>1</td><td>Jim</td><td>10</td></tr>
<tr><td>2</td><td>Ann</td><td>20</td></tr>
<tr><td>3</td><td>Bob</td><td>30</td></tr>
</table>
(6 rows)
该函数使用json functions row_to_json()
,json_each_text()
和aggregate function string_agg()
,它们可以组合在一起,将行显示为列名和值的列表,例如这个例子:
select string_agg(key, ' - ') column_names, string_agg(value, ' - ') column_values
from test_data, json_each_text(row_to_json(test_data))
where id = 1;
column_names | column_values
--------------------+---------------
id - name - amount | 1 - Jim - 10
(1 row)
使用此技术,您可以自由地格式化动态执行查询所产生的行。可以通过添加html ID,类等来轻松修改该函数。