Heim > Datenbank > MySQL-Tutorial > Warum sind die zurückgegebenen Spalten meiner PostgreSQL-Funktion verkettet und wie kann ich das beheben?

Warum sind die zurückgegebenen Spalten meiner PostgreSQL-Funktion verkettet und wie kann ich das beheben?

Mary-Kate Olsen
Freigeben: 2024-12-27 01:38:14
Original
413 Leute haben es durchsucht

Why Are My PostgreSQL Function's Returned Columns Concatenated, and How Can I Fix It?

Der von der Funktion zurückgegebene Datensatz weist verkettete Spalten auf

Beim Verwenden einer Funktion zum Abrufen von Daten für einen bestimmten Zweck kann es vorkommen, dass die zurückgegebenen Daten zurückgegeben werden Die Spalten des Datensatzes werden zu einer einzigen Spalte verkettet. Dies kann auftreten, wenn die Funktion als Unterabfrage in einer anderen Abfrage verwendet wird.

Funktionsergebnisse verstehen

Um die von der Funktion zurückgegebene Zeile zu zerlegen und die einzelnen Spalten zu erhalten, Führen Sie die Funktion einfach separat aus:

SELECT * FROM account_servicetier_for_day(20424, '2014-08-12');
Nach dem Login kopieren

Dies liefert die Ausgabe mit der erwarteten Spaltenanordnung Struktur.

Adressierung der ursprünglichen Abfrage

Um das Problem mit der ursprünglichen Abfrage zu lösen, gibt es je nach verwendeter PostgreSQL-Version mehrere Ansätze:

PostgreSQL 9.3 oder neuer

Verwenden Sie JOIN LATERAL, um die Verbindung herzustellen Unterabfrage und behalten Sie die Zeilenstruktur bei:

SELECT '2014-08-12' AS day, 0 AS inbytes, 0 AS outbytes
     , a.username, a.accountid, a.userid
     , f.*   -- but avoid duplicate column names!
FROM   account_tab a
     , account_servicetier_for_day(a.accountid, '2014-08-12') f  -- <-- HERE
WHERE  a.isdsl = 1
AND    a.dslservicetypeid IS NOT NULL
AND    NOT EXISTS (
   SELECT FROM dailyaccounting_tab
   WHERE  day = '2014-08-12'
   AND    accountid = a.accountid
   )
ORDER  BY a.username;
Nach dem Login kopieren

PostgreSQL 9.2 oder älter

Verwenden Sie eine Unterabfrage, um die Funktion aufzurufen und die Zeile in der äußeren Abfrage zu zerlegen:

SELECT '2014-08-12' AS day, 0 AS inbytes, 0 AS outbytes
     , a.username, a.accountid, a.userid
     , (a.rec).*   -- but be wary of duplicate column names!
FROM  (
   SELECT *, account_servicetier_for_day(a.accountid, '2014-08-12') AS rec
   FROM   account_tab a
   WHERE  a.isdsl = 1
   AND    a.dslservicetypeid Is Not Null
   AND    NOT EXISTS (
       SELECT FROM dailyaccounting_tab
       WHERE  day = '2014-08-12'
       AND    accountid = a.accountid
      )
   ) a
ORDER  BY a.username;
Nach dem Login kopieren

Achten Sie bei beiden Ansätzen auf mögliche doppelte Spaltennamen, wenn Sie die zerlegte Datei auswählen Zeile.

Das obige ist der detaillierte Inhalt vonWarum sind die zurückgegebenen Spalten meiner PostgreSQL-Funktion verkettet und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage