2016-08-21 6 views
3

Ich bin neu in Postgres,Dynamische Abfrageergebnisse in HTML-Tabelle

ich viele SQL Server-Lösungen (gespeicherte Prozeduren, Funktionen) gesehen habe, die Abfrageergebnisse exportieren kann (egal, was die Abfrage) in HTML-Tabelle .

Ich habe versucht, das gleiche in Postgres zu tun, aber fand keinen einfachen Weg. Ich brauche eine Funktion mit einer Abfrage als Argument, die gültigen HTML-Code zurückgibt. Ich bin auf der Suche nach einer reinen SQL-Lösung.

+0

Eine der möglichen Lösungen ist die Verwendung der Funktion 'query_to_xml' (https://www.postgresql.org/docs/current/static/functions-xml .html # FUNCTIONS-XML-MAPPING) und transformiere dann das Ergebnis mit XSLT – Abelisto

+0

Die Frage als zu breit zu markieren ist offensichtlich absurd. Das OP sucht nach einer SQL-Funktion in Postgres, um aus jeder Abfrage eine HTML-Tabelle zu generieren. Sie sollten die gegebene akzeptierte Antwort und die OP-Kommentare ebenfalls berücksichtigen. – klin

+0

ha? zu breit? Ich wette, es gibt andere, die das extrem hilfreich finden. Danke Klin, hoffe, dass die Seitenadministratoren diesen "Wartezustand" entfernen. –

Antwort

3

Die Funktion erzeugt eine einfache HTML-Tabelle aus einer Abfrage:

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 $$; 

Verwendungsbeispiel:

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)  

Die Funktion verwendet json functionsrow_to_json(), json_each_text() und aggregate functionstring_agg(), die kombiniert werden können, präsentieren Zeilen als Listen mit Spaltennamen und Werten, wie in diesem Beispiel:

Mit dieser Technik können Sie die Zeilen, die aus einer dynamisch ausgeführten Abfrage resultieren, frei formatieren. Die Funktion kann leicht durch Hinzufügen von HTML-IDs, Klassen usw. geändert werden.

+0

vielen Dank !!! das ist genau das, was ich brauchte! war nicht auf eine Antwort, mehr für die Anleitung zur Lösung, danke! –