首頁 >資料庫 >mysql教程 >如何在 Informix SQL 中將一對多關係顯示為逗號分隔清單?

如何在 Informix SQL 中將一對多關係顯示為逗號分隔清單?

Patricia Arquette
Patricia Arquette原創
2025-01-03 17:29:40275瀏覽

How to Display One-to-Many Relationships as Comma-Separated Lists in Informix SQL?

使用Informix SQL 作為具有逗號分隔清單的唯一行的一對多關係

與Stack Overflow 上提出的問題類似,這本文提供了一個Informix SQL解決方案,用於將一對多關係顯示為以逗號分隔的單一唯一行

初始資料

id     codes
63592  PELL
58640  SUBL
58640  USBL
73571  PELL
73571  USBL
73571  SUBL

所需輸出

id     codes
63592  PELL
58640  SUBL, USBL
73571  PELL, USBL, SUBL

自訂使用者定義的聚合

為了實現如果需要輸出,則需要自訂使用者定義聚合(UDA)。下面是一個名為 group_concat 的 UDA 範例:

CREATE FUNCTION gc_init(dummy VARCHAR(255)) RETURNING LVARCHAR;
    RETURN '';
END FUNCTION;

CREATE FUNCTION gc_iter(result LVARCHAR, value VARCHAR(255))
    RETURNING LVARCHAR;
    IF result = '' THEN
        RETURN TRIM(value);
    ELSE
        RETURN result || ',' || TRIM(value);
    END IF;
END FUNCTION;

CREATE FUNCTION gc_comb(partial1 LVARCHAR, partial2 LVARCHAR)
    RETURNING LVARCHAR;
    IF partial1 IS NULL OR partial1 = '' THEN
        RETURN partial2;
    ELIF partial2 IS NULL OR partial2 = '' THEN
        RETURN partial1;
    ELSE
        RETURN partial1 || ',' || partial2;
    END IF;
END FUNCTION;

CREATE FUNCTION gc_fini(final LVARCHAR) RETURNING LVARCHAR;
    RETURN final;
END FUNCTION;

CREATE AGGREGATE group_concat
    WITH (INIT = gc_init, ITER = gc_iter,
          COMBINE = gc_comb, FINAL = gc_fini);

分組串聯查詢

將 group_concat UDA group應用於原始數據,我們可以按唯一 id進行分組,使用自定義聚合代碼UDA:

SELECT id, group_concat(codes)
    FROM anonymous_table
    GROUP BY id;

輸出

58640 SUBL,USBL
63592 PELL
73571 PELL,SUBL,USBL

附加註釋

  • 此UDA 處理以下資料型態:可以轉換為VARCHAR(255)(例如,數字或時間
  • 從Informix 12.10.FC5 開始,聚合結果的最大長度為16380 位元組。
  • 要刪除UDA 和關聯函數,請執行以下命令:
DROP AGGREGATE IF EXISTS group_concat;
DROP FUNCTION IF EXISTS gc_fini;
DROP FUNCTION IF EXISTS gc_init;
DROP FUNCTION IF EXISTS gc_iter;
DROP FUNCTION IF EXISTS gc_comb;

以上是如何在 Informix SQL 中將一對多關係顯示為逗號分隔清單?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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