Agregasi Rentetan Oracle dan MySQL: Mencari Setara dengan group_concat
Tugas pangkalan data selalunya memerlukan gabungan data berbilang baris ke dalam satu rentetan. Fungsi group_concat
MySQL memudahkan proses ini. Tetapi bagaimana Oracle mencapai hasil yang sama?
Penyelesaian Oracle
Oracle menawarkan beberapa cara untuk meniru fungsi group_concat
MySQL:
Untuk Oracle 11g dan versi yang lebih baru, fungsi LISTAGG
menyediakan persamaan langsung:
<code class="language-sql">SELECT col1, LISTAGG(col2, ', ') WITHIN GROUP (ORDER BY col2) AS "names" FROM table_x GROUP BY col1</code>
Ini mengagregatkan nilai col2
dengan kemas untuk setiap col1
kumpulan, memisahkannya dengan ', '. Klausa ORDER BY
memastikan susunan rentetan yang konsisten.
Versi Oracle yang lebih lama (10g dan ke bawah) memerlukan fungsi tersuai. Berikut ialah contoh:
<code class="language-sql">CREATE OR REPLACE FUNCTION get_comma_separated_value (input_val NUMBER) RETURN VARCHAR2 IS return_text VARCHAR2(10000) := NULL; BEGIN FOR x IN (SELECT col2 FROM table_name WHERE col1 = input_val) LOOP return_text := return_text || ',' || x.col2 ; END LOOP; RETURN LTRIM(return_text, ','); END; /</code>
Fungsi ini berulang melalui baris, menambahkan nilai pada return_text
. Fungsi LTRIM
mengalih keluar koma di hadapan. Penggunaan:
<code class="language-sql">SELECT col1, get_comma_separated_value(col1) FROM table_name</code>
Perhatikan bahawa WM_CONCAT
wujud dalam beberapa versi Oracle lama tetapi kini tidak disokong.
MySQL group_concat
untuk Perbandingan
Untuk kejelasan, berikut ialah sintaks MySQL group_concat
:
<code class="language-sql">SELECT col1, GROUP_CONCAT(col2) FROM table_name GROUP BY col1</code>
Ini secara ringkas mengagregatkan nilai col2
setiap col1
kumpulan. Walaupun ia tidak mempunyai keupayaan pesanan yang jelas LISTAGG
, ia mempunyai tujuan yang sama.
Atas ialah kandungan terperinci Adakah Oracle Mempunyai Fungsi yang Setara dengan `group_concat` MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!