Ordinare un campo al suo interno durante una select

di Maracaibo70 il
7 risposte

Ciao 

sto provando ad ordinare un campo stringa che contiene ("elem1-elem2-elem3") durante una queri facendo in modo che gli elementi separati da “-” siano ordinati all'interno di un campo, ma non riesco a risolvere.

Select nomecampo1 , nomecampo2 (contiene al suo interno  ("elem1-elem2-elem3")) , nomecampo3 from tabella 

A qualcuno è capitato ?

Ringrazio chi vuole provare a darmi qualche dritta.

7 Risposte

  • Questo problema evidenzia una cattiva progettazione del DB. Quel campo dovrebbe avere un solo valore e non 3

  • 22/02/2023 - oregon ha scritto:


    Questo problema evidenzia una cattiva progettazione del DB. Quel campo dovrebbe avere un solo valore e non 3

    Si lo so, infatti faccio miracoli per interrogarlo, è nato per essere gestito da tecnologia microsoft pq piu flessibile in questi casi ma lenta nell elaborazione. 

    Mi sa che non c e una soluzione per questo problema.

    Non ho chiaro se su mysql è possibile creare una procedura e poi riutilizzarla come funzione all interno di una query 

  • Non è questione di quale DBMS usi. La struttura è sbagliata e deve essere corretta e normalizzata 

  • Non è possibile bisogna adeguarsi 

  • Fallo nella tua applicazione (nel linguaggio che utilizzi)

    Oppure con una Stored Procedure

    Non lo puoi fare con una semplice query

  • Si, stavo realizzando che non c'è altra soluzione, c'avevo sperato.

    Grazie

  • Salve,

    [OT]

    al di la' che “sia una cosa bruttissima”, in T-SQL si puo' fare, ad esempio con STRING_SPLIT(..) + STRING_AGG (…) WITHING GROUP (ORDER BY ….)

    sicuramente “pesante” dal punto di vista computazionale visto che OGNI riga deve essere scomposta in sotto insiemi di CampoX per poi riaggregare questi insiemi per valore ordinato…. ma si puo' fare…

    DECLARE @t TABLE (Id int, Campo2 varchar(50));
    INSERT @t
     VALUES ( 1, '' )
     , ( 2, 'elemento2-elemento1' )
     , ( 3, 'elemento2-elemento3-elemento1' );
    
    WITH cteSplit AS (
     SELECT t.Id
       , value AS SplitValue
       FROM @t t
       		CROSS APPLY STRING_SPLIT(t.Campo2, '-')
       ),
    cteOrd AS (
     SELECT Id, STRING_AGG(SplitValue, '-') WITHIN GROUP (ORDER BY SplitValue ASC) AS SplitValueOrdered
       FROM cteSplit
       GROUP BY Id
     )
     SELECT t.*
       , c.SplitValueOrdered
       FROM @t t
         LEFT JOIN cteOrd c ON c.Id = t.Id
       ORDER BY t.Id;

    [/OT]

    quindi, forse si puo' fare anche in MySql…. cio' non toglie che, come gia' detto, e' molto sbagliato :D

    salutoni romagnoli
    – 
    Andrea

Devi accedere o registrarti per scrivere nel forum
7 risposte