sql >> Database >  >> RDS >> Oracle

Converteer WM_CONCAT naar Listagg

De basissyntaxis van LISTAGG is:

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

In jouw geval, aangezien je een subquery als resultaat hebt ingesteld op WM_CONCAT , kunt u dezelfde subquery plaatsen in plaats van col_name_to_be_aggregated in LISTAGG .

Ik denk dat je ook alle VERVANG . kunt verwijderen functies, aangezien LISTAGG het scheidingsteken . kan accepteren van jouw keuze.

Probeer,

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)

Ook wil ik uitleggen waarom u in 12c naar LISTAGG moet verhuizen. Sinds t is verwijderd uit de nieuwste 12c-versie. Daarom zal elke toepassing die op de WM_CONCAT-functie heeft vertrouwd, niet werken nadat deze is geüpgraded naar 12c. Lees Waarom WM_CONCAT niet gebruiken functie in Oracle?

Voor pre-11g Release 2 kunt u LISTAGG niet gebruiken. Er zijn veel technieken voor stringaggregatie, bekijk mijn antwoord hier .

Meer details over Oracle String Aggregation-technieken



  1. Of de prestaties van invloed zijn wanneer de databaseprocedure vaak vanuit de toepassing wordt aangeroepen?

  2. Het verplaatsen van een database met pg_dump en psql -U postgres db_name <... resulteert in FOUT:relatie tabelnaam bestaat niet

  3. Dynamische kruistabelquery in Oracle

  4. Meerdere SET-velden met LOAD DATA INFILE voor datumnotatie