Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Converter WM_CONCAT para Listagg


A sintaxe básica de LISTAGG é:
LISTAGG(col_name_to_be_aggregated, ',') WITHIN GROUP (ORDER BY col)

No seu caso, como você tem uma subconsulta como resultado definido como WM_CONCAT , você pode colocar a mesma subconsulta no lugar de col_name_to_be_aggregated em LISTAGG .

Acho que você também pode se livrar de todos os REPLACE funções, pois LISTAGG pode aceitar o delimitador da sua escolha.

Tentar,
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)

Além disso, gostaria de explicar por que você precisa mudar para LISTAGG em 12c. Desde que t foi removido da versão 12c mais recente. Portanto, qualquer aplicativo que dependia da função WM_CONCAT não funcionará uma vez atualizado para 12c. Leia Por que não usar WM_CONCAT função no Oracle?

Para a versão 2 pré-11g, você não pode usar LISTAGG. Existem muitas técnicas de agregação de strings, dê uma olhada na minha resposta aqui .

Mais detalhes sobre as Técnicas de agregação de strings do Oracle