Oracle
 sql >> Database >  >> RDS >> Oracle

Converti WM_CONCAT in Listagg

La sintassi di base di LISTAGG è:

LISTAGG(col_name_to_be_aggregated, ',') WITHIN GROUP (ORDER BY col)

Nel tuo caso, poiché hai una sottoquery come risultato impostato su WM_CONCAT , potresti inserire la stessa sottoquery al posto di col_name_to_be_aggregated in LISTAGG .

Penso che tu possa anche sbarazzarti di tutti i REPLACE funzioni, poiché LISTAGG può accettare il delimitatore di tua scelta.

Prova,

LISTAGG
(
  CASE
  WHEN ROW_NUMBER() OVER (PARTITION BY product_id,
                                       product_detail_set_id,
                                       registration_id,
                                       product_family_id,
                                       application_id,
                                       package_Set_id, 
                                       legal_status 
                                       order by packset_country)=1 THEN
    legal_status
  ELSE
    NULL
  END), ',') WITHIN GROUP (ORDER BY required_col)

Inoltre, vorrei spiegare perché è necessario passare a LISTAGG in 12c. Dal momento che t è stato rimosso dall'ultima versione 12c. Pertanto, qualsiasi applicazione che si è basata sulla funzione WM_CONCAT non funzionerà una volta aggiornata a 12c. Leggi Perché non usare WM_CONCAT funzione in Oracle?

Per la versione 2 precedente a 11g, non puoi usare LISTAGG. Esistono molte tecniche di aggregazione di stringhe, dai un'occhiata alla mia risposta qui .

Maggiori dettagli su Tecniche di aggregazione di stringhe Oracle