Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    ORDER BY Oracle vs SQL Server 2008

    Salve, espongo di seguito il problema:
    Convertendo alcune query da Oracle a Sql Server mi sono accorta che l'order by segue criteri diversi per le stringhe alfanumeriche.

    Es. Suppongo di avere una tabella PRODOTTi (id, codice) con codice (nvarchar(100))
    La query: SELECT CODICE FROM PRODOTTI ORDER BY CODICE

    Su oracle:

    A
    A
    A.client1cc
    A.c1pr
    A.10
    A.10.client1df
    A.10.f2se
    A.10.f2se
    A.10.10
    A.10.10.01
    A.10.10.01
    A.10.11
    A.10.11
    A.10.11.01
    A.10.11.01
    A.10.11.02
    A.10.11.02
    A.11
    A.11
    A.11.12.21
    A.12.02
    B
    B
    01
    02
    03
    03.005
    03.010
    03.015
    04
    05
    06



    Su SQL server:

    01
    02
    03
    03.005
    03.010
    03.015
    04
    05
    06
    A
    A
    A.10
    A.10.10
    A.10.10.01
    A.10.10.01
    A.10.11
    A.10.11
    A.10.11.01
    A.10.11.01
    A.10.11.02
    A.10.11.02
    A.10.client1df
    A.10.f2se
    A.10.f2se
    A.11
    A.11
    A.11.12.21
    A.12.02
    A.c1pr
    A.client1cc
    B
    B

    Oracle ordina prima alfabeticamente e poi numericamente, SQL Server il contrario. Come posso portare l'ordinamento su SQL server analogo a quello su Oracle? HELP ME

  2. #2
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Non conosco sql server, ma sicuramente è un problema relativo alla collation usata. Dovresti trovare il modo di capire qual è e come cambiarla

  3. #3
    Ho provato ad aggiungere nell'istruzione collate alcuni nomi presi da SELECT * FROM sys.fn_helpcollations(). Ma sembra non cambiare nulla nel risultato della mia query Su internet c'è poca documentazione a riguardo

  4. #4
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Ti fai un campo calcolato che prende valore:
    -- b se i primi 2 caratteri sono cifre
    -- a nel caso alternativo ( else )

    Dopo ordini prima per questo campo e poi per il tuo campo




    Più o meno viene cosi ( ma devi mettere a posto la sintassi )
    ORDER BY CASE WHENN RIGHT(TuoCampo, 2) IsNummer THEN 'b' ELSE 'a' END, TuoCampo


    .


    No No sono stato troppo impulsivo, se poi ti capita una stringa composta da caratteri e cifre
    allora non va più bene
    Ultima modifica di nman; 08-05-2014 a 21:01

  5. #5
    Utente di HTML.it L'avatar di comas17
    Registrato dal
    Apr 2002
    Messaggi
    6,522
    Dovrebbe essere "SELECT CODICE FROM PRODOTTI ORDER BY CODICE COLLATE SQL_EBCDIC037_CP1_CS_AS"

    Funziona su SQL Server 2005, penso anche nelle versioni successive

    Trovato qui: http://www.sqlservercentral.com/Foru...716-338-1.aspx
    Ultimo post


    Spiegazione tecnica:

    EBCDIC sort sequence where letters sort before numerals instead of / prior to ASCII.

    EBCDIC Order
    The z/OS operating environment uses the EBCDIC collating sequence.
    The sorting order of the English-language EBCDIC sequence is

    blank . < ( + | & ! $ * ) ; ¬ - / , % _ > ?: # @ ' = "
    a b c d e f g h i j k l m n o p q r ~ s t u v w x y z
    { A B C D E F G H I } J K L M N O P Q R \S T
    U V W X Y Z 0 1 2 3 4 5 6 7 8 9

    -----------------------------------------------------------------

    ASCII Order
    UNIX, OpenVMS, Windows
    The English-language ASCII sequence is

    blank ! " # $ % & ' ( ) * + , - . /0 1 2 3 4 5 6 7 8 9 : ; < = > ? @
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z[ \] ˆ_
    a b c d e f g h i j k l m n o p q r s t u v w x y z { } ~
    Ultima modifica di comas17; 08-05-2014 a 21:50

  6. #6
    Ho provato ad aggiungere il collate e funziona nel caso di una select semplice. Io precisamente ho una query ricorsiva di questo genere

    with c(path_ids,path_descr, path_cod, id, lvl) as
    ( select '/'+cast(id as varchar(49)) as path_ids,
    '/'+cast(descrizione as varchar(max)) as path_descr,
    cast(codice as nvarchar(max)) as path_cod,
    id, 1 as lvl

    from dbo.PDC b
    where b.ID_PDC_PADRE is null
    union all
    select cast(c.path_ids+'/'+CAST(b.id as varchar(4)) as varchar(50)),
    cast(c.path_descr+'/'+CAST(b.descrizione as varchar(50)) as varchar(max)),
    cast(c.path_cod+'.'+CAST(b.codice as nvarchar(50)) as nvarchar(max)),

    b.id, (c.lvl + 1) as lvl

    from dbo.PDC b join c on b.ID_PDC_PADRE = c.id)

    select c.lvl,(c.path_ids +'/') as path_ids, (c.path_descr +'/') as path_descr, (c.path_cod) as path_cod,
    CASE WHEN EXISTS (SELECT * FROM dbo.PDC c2 WHERE c2.ID_PDC_PADRE = b.ID) THEN 0 ELSE 1 END AS is_foglia,
    b.ID,b.CODICE, b.DESCRIZIONE, b.ID_PDC_SEZIONE, b.COD_PDC_TIPO_SEZIONE, b.COD_PDC_CLASS_SOTTOC, b.DATA_INIZIO_VALIDITA,
    b.DATA_FINE_VALIDITA, b.ID_PDC_PADRE, b.IS_SOTTOCONTO, b.NOTE, b.CC_PDC, b.RIF_ID_CONT_CLIFOR

    from c join dbo.PDC b on c.id = b.ID
    WHERE b.ID_PDC_SEZIONE IN (SELECT ID FROM dbo.PDC_SEZIONI WHERE ID_ATTIVITA>0)
    order by c.path_cod COLLATE SQL_EBCDIC037_CP1_CS_AS;


    In tal caso il sort che gli impongo sembra fregarsene del collate e mi ordina i dati secondo l'ordine ASCII di default. Non capisco perchè

  7. #7
    per non complicarti la vita, fai un primo output su una tabella temporanea, poi nella SELECT finali imposti l'ORDER BY ... COLLATE


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.