Ordinare risultati con spazi vuoti alla fine

Con risposta Ordinare risultati con spazi vuoti alla fine

  • lunedì 13 febbraio 2012 16:21
     
      Contiene codice

    Salve a tutti, ho una domanda da fare. Avendo una query di estrazione dati, ordinata in ordine ascendente per nome ad esempio ,ottengo come ordinamento prima i risultati vuoti (campi dato di tipo string "") e poi i dati che cominciano per A fino alla Z 

    Come devo modificare la query in maniera da mettere gli spazi vuoti dopo la Z ??

    Grazie!

    p.s. non devo eliminare gli spazi vuoti,ma solo metterli dopo l ultima lettera dell alfabeto

    Qui sotto c è la query esatta che dovrei modificare

    "select ROW_NUMBER()over (order by nome) as 'Numero',* 
    FROM ((select distinct nome,email) INTERSECT select (distinct nome,email)) as elenco_numerico"





    • Modificato NikkySixx lunedì 13 febbraio 2012 17:23
    •  

Tutte le risposte

  • lunedì 13 febbraio 2012 22:49
    Moderatore
     
     Con risposta Contiene codice

    salve,

    puoi impostare un ulteriore parametro di ordinamento "definendo" il criterio che "l'assenza di un valore" abbia un valore alto, un "valore vuoto" abbia un valore meno alto, e la presenza di un valore abbia un valore 0, quindi tipicamente, "se NULL = 2, se '' = 1, ELSE 0", per poi ordinare precisamente in base al nome, questo per comprendere anche l'eventualita' che la colonna sia nullabile e per definire un criterio diverso di ordinamento per il NULL stesso...

    dovresti poi anche vedere la collation che stai utilizzando per comprendere l'ordinamente delle minuscole/maiuscole se intendi affrontarlo, come puoi vedere nell'esempio completo qui sotto, 

    SET NOCOUNT ON;
    USE tempdb;
    GO
    CREATE TABLE dbo.t (
    	Id int NOT NULL IDENTITY PRIMARY KEY,
    	Nome varchar(10) DEFAULT '',
    	eMail varchar(10) NOT NULL DEFAULT ''
    	);
    GO
    INSERT INTO dbo.t VALUES ( '', 'a.a.com');
    INSERT INTO dbo.t VALUES ( 'b', 'b.a.com');
    INSERT INTO dbo.t VALUES ( '', '');
    INSERT INTO dbo.t VALUES ( NULL, 'NULL');
    INSERT INTO dbo.t VALUES ( 'z', 'z.a.com');
    INSERT INTO dbo.t VALUES ( 'Z', 'b.a.com');
    INSERT INTO dbo.t VALUES ( 'A', 'c.a.com');
    INSERT INTO dbo.t VALUES ( 'a', 'd.a.com');
    GO
    SELECT  DATABASEPROPERTYEX('tempdb', 'Collation') AS [My Default Database Collation]
    PRINT 'Ordinamento sul ''nome'' in base alla collation di default del database';
    SELECT *
    	FROM dbo.t t
    	ORDER BY CASE WHEN t.Nome = '' THEN 1 ELSE 0 END,
    		t.Nome;
    
    PRINT 'Ordinamento sul ''nome'' in base alla collation binaria Latin_General';
    SELECT *
    	FROM dbo.t t
    	ORDER BY CASE WHEN t.Nome IS NULL THEN 2 WHEN t.Nome = '' THEN 1 ELSE 0 END ASC,
    		t.Nome COLLATE Latin1_General_100_BIN;
    
    PRINT 'Ordinamento sul ''nome'' in base alla collation Latin_General Case Insensitive';
    SELECT *
    	FROM dbo.t t
    	ORDER BY CASE WHEN t.Nome IS NULL THEN 2 WHEN t.Nome = '' THEN 1 ELSE 0 END ASC,
    		t.Nome COLLATE Latin1_General_100_CI_AI;
    
    PRINT 'Ordinamento sul ''nome'' in base alla collation Latin_General Case Sensitive';
    SELECT *
    	FROM dbo.t t
    	ORDER BY CASE WHEN t.Nome IS NULL THEN 2 WHEN t.Nome = '' THEN 1 ELSE 0 END ASC,
    		t.Nome COLLATE Latin1_General_100_CS_AI;
    
    GO
    DROP TABLE dbo.t;
    --<----------
    My Default Database Collation
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Latin1_General_CI_AS
    
    Ordinamento sul 'nome' in base alla collation di default del database
    Id          Nome       eMail
    ----------- ---------- ----------
    4           NULL       NULL
    7           A          c.a.com
    8           a          d.a.com
    2           b          b.a.com
    5           z          z.a.com
    6           Z          b.a.com
    3                      
    1                      a.a.com
    
    Ordinamento sul 'nome' in base alla collation binaria Latin_General
    Id          Nome       eMail
    ----------- ---------- ----------
    7           A          c.a.com
    6           Z          b.a.com
    8           a          d.a.com
    2           b          b.a.com
    5           z          z.a.com
    1                      a.a.com
    3                      
    4           NULL       NULL
    
    Ordinamento sul 'nome' in base alla collation Latin_General Case Insensitive
    Id          Nome       eMail
    ----------- ---------- ----------
    7           A          c.a.com
    8           a          d.a.com
    2           b          b.a.com
    5           z          z.a.com
    6           Z          b.a.com
    3                      
    1                      a.a.com
    4           NULL       NULL
    
    Ordinamento sul 'nome' in base alla collation Latin_General Case Sensitive
    Id          Nome       eMail
    ----------- ---------- ----------
    8           a          d.a.com
    7           A          c.a.com
    2           b          b.a.com
    5           z          z.a.com
    6           Z          b.a.com
    3                      
    1                      a.a.com
    4           NULL       NULL
    

    saluti


    http://www.asql.biz - DbaMgr2k - DbaMgr and further SQL Tools http://www.hotelsole.com/

    • Contrassegnato come risposta NikkySixx martedì 6 marzo 2012 08:08
    •