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
Mary-Kate OlsenOriginal
2024-12-27 01:38:14414Durchsuche

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');

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;

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;

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!

Stellungnahme:
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