首頁 >資料庫 >mysql教程 >為什麼我的 PostgreSQL 函數傳回的欄位是串聯的,如何修復它?

為什麼我的 PostgreSQL 函數傳回的欄位是串聯的,如何修復它?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-27 01:38:14357瀏覽

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

函數傳回的記錄具有串聯的資料列

當使用函數為特定目的擷取資料時,可能會遇到傳回的結果記錄的列連接成單一列。當函數用作另一個查詢中的子查詢時,可能會發生這種情況。

理解函數結果

要分解從函數傳回的行並取得各個列,只需單獨執行函數:

SELECT * FROM account_servicetier_for_day(20424, '2014-08-12');

這將提供具有預期柱狀的輸出

解決原始查詢

要解決原始查詢的問題,根據所使用的PostgreSQL 版本,有幾種方法:

PostgreSQL 9.3 或更高版本

使用JOIN LATERAL 連接子查詢並保留行結構:

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;
使用JOIN LATERAL 連接子查詢並保留行結構:

PostgreSQL 9.2或更舊

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;
使用子查詢呼叫函數並分解外層中的行查詢:

無論哪種方法,在選擇分解時都要注意潛在的重複列名行。

以上是為什麼我的 PostgreSQL 函數傳回的欄位是串聯的,如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn