Heim > Datenbank > MySQL-Tutorial > Wie kann ich dynamische SQL-Rückgabetypen in PostgreSQL mit unterschiedlichen Spaltennamen und -typen verarbeiten?

Wie kann ich dynamische SQL-Rückgabetypen in PostgreSQL mit unterschiedlichen Spaltennamen und -typen verarbeiten?

DDD
Freigeben: 2025-01-22 23:46:11
Original
103 Leute haben es durchsucht

How Can I Handle Dynamic SQL Return Types in PostgreSQL with Varying Column Names and Types?

Dynamisches PostgreSQL-SQL und Rückgabetypen

Verarbeitung benutzerdefinierter Rückgabetypen mit unterschiedlichen Spaltennamen und -typen

In Ihrem Szenario ändert sich der Rückgabetyp aufgrund unterschiedlicher Spaltennamen und -typen. Um dies zu bewältigen, können Sie die Fähigkeit von PostgreSQL nutzen, anonyme Datensatztypen zurückzugeben:

<code class="language-sql">CREATE FUNCTION data_of(integer)
RETURNS SETOF record AS
...</code>
Nach dem Login kopieren

Dieser Ansatz erfordert jedoch die manuelle Angabe von Spaltendefinitionen in jedem Funktionsaufruf:

<code class="language-sql">SELECT * FROM data_of(17)
AS foo (colum_name1 integer
      , colum_name2 text
      , colum_name3 real);</code>
Nach dem Login kopieren

Um diesen langwierigen Ansatz zu vermeiden, können Sie Dokumentdatentypen wie JSON oder XML verwenden, um unstrukturierte Daten zu speichern:

<code class="language-sql">CREATE FUNCTION data_of(integer)
RETURNS JSONB AS
...</code>
Nach dem Login kopieren

Dieser Ansatz geht jedoch auf Kosten der Vorteile strukturierter PostgreSQL-Datentypen.

Korrigierter Rückgabetyp mithilfe der Spaltenkonvertierung

Wenn Ihre Datenstruktur konsistent ist (mit Ausnahme der Spaltennamen), können Sie eine feste Anzahl korrekt benannter und typisierter Spalten zurückgeben:

<code class="language-sql">CREATE FUNCTION data_of(_id integer)
RETURNS TABLE (datahora timestamp, col2 text, col3 text) AS
$func$
...</code>
Nach dem Login kopieren

Der Einfachheit halber wird jede Spalte explizit in den Typ TEXT konvertiert.

Variable Anzahl von Spalten mit demselben Typ

Wenn Sie eine variable Anzahl von Spalten desselben Typs haben, können Sie ein Array zum Speichern der Werte verwenden:

<code class="language-sql">CREATE FUNCTION data_of(_id integer)
RETURNS TABLE (datahora timestamp, names text[], values float8[]) AS
$func$
...</code>
Nach dem Login kopieren
Nach dem Login kopieren

Außerdem können Sie die Spaltennamen als Array zurückgeben:

<code class="language-sql">CREATE FUNCTION data_of(_id integer)
RETURNS TABLE (datahora timestamp, names text[], values float8[]) AS
$func$
...</code>
Nach dem Login kopieren
Nach dem Login kopieren

Alle Spalten der Tabelle polymorph zurückgeben

Um alle Spalten einer Tabelle unabhängig von ihrer Struktur zurückzugeben, können Sie den Pseudodatentyp anyelement verwenden:

<code class="language-sql">CREATE FUNCTION data_of(_tbl_type anyelement, _id int)
RETURNS SETOF anyelement AS
$func$
BEGIN
   RETURN QUERY EXECUTE format('
      SELECT *
      FROM   %s  -- pg_typeof returns regtype, quoted automatically
      WHERE  id = 
      ORDER  BY datahora'
    , pg_typeof(_tbl_type))
   USING  _id;
END
$func$;</code>
Nach dem Login kopieren

Rufen Sie diese Funktion mit NULL des gewünschten Tabellentyps auf, um den Rückgabetyp dynamisch zu bestimmen:

<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17);</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich dynamische SQL-Rückgabetypen in PostgreSQL mit unterschiedlichen Spaltennamen und -typen verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage