Oracle
 sql >> Base de données >  >> RDS >> Oracle

Convertir WM_CONCAT en Listagg

La syntaxe de base de LISTAGG est :

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

Dans votre cas, puisque vous avez une sous-requête comme résultat défini sur WM_CONCAT , vous pouvez mettre la même sous-requête à la place de col_name_to_be_aggregated dans LISTAGG .

Je pense que vous pouvez également vous débarrasser de tous les REPLACE fonctions, puisque LISTAGG peut accepter le délimiteur de votre choix.

Essayez,

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)

Aussi, je voudrais expliquer pourquoi vous devez passer à LISTAGG en 12c. Puisque t a été supprimé de la dernière version 12c. Par conséquent, toute application qui s'appuyait sur la fonction WM_CONCAT ne fonctionnera pas une fois mise à niveau vers 12c. Lire Pourquoi ne pas utiliser WM_CONCAT fonction dans Oracle ?

Pour la version 2 pré-11g, vous ne pouvez pas utiliser LISTAGG. Il existe de nombreuses techniques d'agrégation de chaînes, jetez un œil à ma réponse ici .

Plus de détails sur Techniques d'agrégation de chaînes Oracle