none
Ordinare risultati con spazi vuoti alla fine

    Domanda

  • 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
    lunedì 13 febbraio 2012 16:21

Risposte

  • 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
    lunedì 13 febbraio 2012 22:49
    Moderatore