none
Problema Query SQL SERVER 2008 RRS feed

  • Domanda

  • Salve a tutti,

    Quando effettuo la seguente query sql:

    select ISNULL(nome_citta,' pippo ') as nome_citta from tbl_citta where id_citta='1'

    Visto che non esiste una tupla con id_citta = 1, la mia query dovrebbe restituire pippo, il risultato invece è solo il nome della colonna.

    Cosa sto sbagliando? 

    Grazie a tutti!

     
    giovedì 7 marzo 2013 16:41

Risposte

  • Invece c'è una differenza! :)

    il server in quel caso non trova nessuna tupla, quindi non può esaminare il contenuto del campo [nome_citta] e gestirne il valore NULL, quindi è il risultato ad essere NULL e non il campo.

    giovedì 7 marzo 2013 19:04
  • Aggiungo un esempio rafforzativo di quanto correttamente dice Luca.

    Siccome ISNULL non viene eseguita eccoti l'esempio per una possibile alternativa:

    USE tempdb;
    GO
    
    CREATE TABLE #tbl_citta 
    (
    	id_citta int NOT NULL PRIMARY KEY CLUSTERED
      , nome_citta varchar(50) NOT NULL  
    );
    GO
    
    
    INSERT INTO #tbl_citta ( id_citta, nome_citta ) VALUES (2, 'Milano');
    INSERT INTO #tbl_citta ( id_citta, nome_citta ) VALUES (3, 'Parma');
    
    -- non torna righe, isnull non viene nemmeno valutato
    SELECT
    	ISNULL(nome_citta, 'pippo') AS Nome
    FROM
    	#tbl_citta
    WHERE 
    	id_citta = 1;
    GO
    
    -- possibile alternativa a DB
    DECLARE @Nome varchar(50) = NULL;
    
    SELECT
    	@Nome = ISNULL(nome_citta, 'pippo')
    FROM
    	#tbl_citta
    WHERE 
    	id_citta = 1;
    
    SELECT @Nome AS Nome;
    
    DROP TABLE #tbl_citta;
    GO

    Per questo tipo di controlli forse, puoi pensare, sempre che esista, di demandare all'applicazione la gestione del resultset vuoto (o anche del null), senza preoccuparti di tornare un null all'applicazione stessa. Eviteresti di fatto di far gestire a database una logica che magari serve solo all'applicazione.

    ciao


    Alessandro Alpi SQL Server MVP

    venerdì 8 marzo 2013 09:50
    Moderatore

Tutte le risposte

  • Invece c'è una differenza! :)

    il server in quel caso non trova nessuna tupla, quindi non può esaminare il contenuto del campo [nome_citta] e gestirne il valore NULL, quindi è il risultato ad essere NULL e non il campo.

    giovedì 7 marzo 2013 19:04
  • Aggiungo un esempio rafforzativo di quanto correttamente dice Luca.

    Siccome ISNULL non viene eseguita eccoti l'esempio per una possibile alternativa:

    USE tempdb;
    GO
    
    CREATE TABLE #tbl_citta 
    (
    	id_citta int NOT NULL PRIMARY KEY CLUSTERED
      , nome_citta varchar(50) NOT NULL  
    );
    GO
    
    
    INSERT INTO #tbl_citta ( id_citta, nome_citta ) VALUES (2, 'Milano');
    INSERT INTO #tbl_citta ( id_citta, nome_citta ) VALUES (3, 'Parma');
    
    -- non torna righe, isnull non viene nemmeno valutato
    SELECT
    	ISNULL(nome_citta, 'pippo') AS Nome
    FROM
    	#tbl_citta
    WHERE 
    	id_citta = 1;
    GO
    
    -- possibile alternativa a DB
    DECLARE @Nome varchar(50) = NULL;
    
    SELECT
    	@Nome = ISNULL(nome_citta, 'pippo')
    FROM
    	#tbl_citta
    WHERE 
    	id_citta = 1;
    
    SELECT @Nome AS Nome;
    
    DROP TABLE #tbl_citta;
    GO

    Per questo tipo di controlli forse, puoi pensare, sempre che esista, di demandare all'applicazione la gestione del resultset vuoto (o anche del null), senza preoccuparti di tornare un null all'applicazione stessa. Eviteresti di fatto di far gestire a database una logica che magari serve solo all'applicazione.

    ciao


    Alessandro Alpi SQL Server MVP

    venerdì 8 marzo 2013 09:50
    Moderatore
  • Grazie, mi avete confermato i miei dubbi!

    Ho gestito a livello di applicazione!

    venerdì 8 marzo 2013 16:23
  • Se pensi che le risposte siano corrette flaggale pure come risposta al topic per chiuderlo ;)

    Alla prossima, un saluto!

    lunedì 11 marzo 2013 16:34