首頁 >資料庫 >mysql教程 >在 Oracle 中,如何在不使用預存程序的情況下將多行連接成一行?

在 Oracle 中,如何在不使用預存程序的情況下將多行連接成一行?

Barbara Streisand
Barbara Streisand原創
2025-01-05 20:02:401027瀏覽

How Can I Concatenate Multiple Rows into a Single Row in Oracle Without Using a Stored Procedure?

在Oracle 中不使用預存程序將多行連接成一行

在Oracle 中處理資料時,可能會出現以下情況:需要將多行合併為一行。傳統上,這可以使用預存程序來實現。不過,有一個更有效率、更直接的解決方案,即使用 Oracle 的 LISTAGG 子句。

Oracle 中的 LISTAGG 子句

在 Oracle 11gR2 中引入,LISTAGG 子句可讓您串聯多個值合併到一個字串中。它採用以下語法:

LISTAGG(expression, delimiter) WITHIN GROUP (ORDER BY column)
  • 表達式:要連接的欄位或表達式。
  • 分隔符號:您想要在數值之間使用的分隔符號(例如,a逗號)。
  • 欄位: 用於每組內的值進行排序的欄位。

範例

考慮以下資料集:

question_id element_id
1 7
1 8
2 9
3 10
3 11
3 12

連接將每個 Question_id 的 element_id值放入一行中,我們可以使用以下查詢:

SELECT question_id,
       LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id)
FROM your_table
GROUP BY question_id;

輸出

question_id element_id
1 7,8
2 9
3 10,11,12

大結果的注意事項Strings

如果結果字串預計超過4000 個字元(VARCHAR2 資料類型的最大長度),您可以使用Oracle 12cR2 中引入的以下增強功能:

SELECT question_id,
       LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id) ON OVERFLOW TRUNCATE/ERROR
FROM your_table
GROUP BY question_id;
  • ON OVERFLOW TRUNCATE: 截斷結果字串如果超過指定長度。
  • ON OVERFLOW ERROR: 如果結果字串超過指定長度,則會引發錯誤。

以上是在 Oracle 中,如何在不使用預存程序的情況下將多行連接成一行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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