html - 动态查询结果到 HTML 表格

标签 html sql postgresql

<分区>

我是 Postgres 的新手,

我见过许多允许将查询结果(无论查询是什么)导出到 HTML 表中的 SQL Server 解决方案(存储过程、函数)。

我一直在尝试在 Postgres 中做同样的事情,但没有找到简单的方法。我需要一个以查询作为参数的函数,它返回有效的 HTML 代码。我正在寻找纯 SQL 解决方案。

最佳答案

该函数根据查询生成一个简单的 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、类等轻松修改。

关于html - 动态查询结果到 HTML 表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39068258/

相关文章:

javascript - 防止点击 div 到底层 <a href

sql - 如何在一个 LIKE 模式中描述以一个或两个数字结尾的字符串?

python - 如何在 Django ORM 中随时间存储数据?

javascript - HTML 框架 - 当用户单击正文时防止 Bootstrap 弹出窗口消失

javascript - 同一 block 元素一次可见和变量命名

html - 通用基于用户的宽度

sql - 如何在 SQL Server 中匹配排除括号之间差异的文本?

php - 如何反转 MySQL 结果

ruby-on-rails - 在 Rails 中对数字字符串进行排序

string - PostgreSQL : Find the string with the closest substring match