sql >> Base de Datos >  >> RDS >> Oracle

Convertir WM_CONCAT a Listagg

La sintaxis básica de LISTAGG es:

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

En su caso, dado que tiene una subconsulta como resultado establecido en WM_CONCAT , podría colocar la misma subconsulta en lugar de col_name_to_be_aggregated en LISTAGG .

Creo que también puedes deshacerte de todos los REPLACE funciones, ya que LISTAGG puede aceptar el delimitador de tu preferencia.

Prueba,

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)

Además, me gustaría explicar por qué necesita mudarse a LISTAGG en 12c. Dado que t se eliminó de la última versión 12c. Por lo tanto, cualquier aplicación que dependa de la función WM_CONCAT no funcionará una vez que se actualice a 12c. Lea ¿Por qué no usar WM_CONCAT? función en Oracle?

Para la versión 2 anterior a 11g, no puede usar LISTAGG. Hay muchas técnicas de agregación de cadenas, echa un vistazo a mi respuesta aquí .

Más detalles sobre técnicas de agregación de cadenas de Oracle