首頁 >資料庫 >mysql教程 >如何處理 PostgreSQL 中具有不同列名和類型的動態 SQL 傳回類型?

如何處理 PostgreSQL 中具有不同列名和類型的動態 SQL 傳回類型?

DDD
DDD原創
2025-01-22 23:46:11105瀏覽

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

PostgreSQL動態SQL與回傳型別

應對不同列名和類型的自訂回傳類型

在您的場景中,由於列名和類型不同,傳回類型也會有所變化。為了處理這個問題,您可以利用PostgreSQL傳回匿名記錄類型的能力:

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

但是,這種方法需要在每次函數呼叫中手動指定列定義:

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

為了避免這種繁瑣的方法,您可以使用JSON或XML等文件資料類型來儲存非結構化資料:

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

然而,這種方法會犧牲PostgreSQL結構化資料型別的優勢。

使用列轉換的固定回傳類型

如果您的資料結構一致(除了列名不同),您可以傳回固定數量的正確命名和類型的列:

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

為簡單起見,每一列都明確轉換為TEXT類型。

具有相同類型的可變列數

如果您有可變數量的相同類型的列,可以使用陣列來儲存值:

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

此外,您可以將列名作為數組傳回:

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

多態地傳回表格的所有欄位

為了傳回表的全部列,無論其結構如何,您可以使用anyelement偽資料類型:

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

使用所需表格類型的NULL來動態決定傳回類型,呼叫函數:

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

以上是如何處理 PostgreSQL 中具有不同列名和類型的動態 SQL 傳回類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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