none
sql filtro campo testo RRS feed

  • Domanda

  • salve

    ho una tabella

    ID - INT CAMPO CHIAVE

    LETTERA VARCHAR(2) -- POSSIBILE NULL

    se in lettera ho UN SOLO CARATTERE ES 'A' o 'B'

    SELECT     Lettera, Id
    FROM         PROVA
    WHERE     (Lettera = N'A')

    (COSA VUOL DIRE N'A'????)

    se volessi filtrare tutti quelli che NON HANNO LA LETTERA 'A'

    SELECT     Lettera, Id
    FROM         PROVA
    WHERE     (Lettera <> N'A')  

    ----> errore PERCHE' HO UN RISULTATO CON NESSUN RECORD

    GRAZIE

    lunedì 19 agosto 2013 10:35

Risposte

  • Ciao,

    rafforzo quanto dice Emiliano con un esempio:

    USE tempdb;
    GO
    
    
    CREATE TABLE #tempLettere (ID int PRIMARY KEY, Lettera varchar(2) NULL)
    GO
    
    INSERT INTO #tempLettere (ID, Lettera) VALUES (1, 'A');
    INSERT INTO #tempLettere (ID, Lettera) VALUES (2, 'B');
    INSERT INTO #tempLettere (ID, Lettera) VALUES (3, NULL);
    
    SELECT     
    	  Lettera
    	, ID
    FROM         
    	#tempLettere
    WHERE     
    	Lettera = 'A';
    
    /*
    Lettera ID
    ------- -----------
    A       1
    */
    
    SELECT     
    	  Lettera
    	, ID
    FROM         
    	#tempLettere
    WHERE     
    	Lettera <> 'A' ;
    
    /*
    Lettera ID
    ------- -----------
    B       2
    */
    
    -- pulizia
    DROP TABLE #tempLettere;
    GO

    Nonostante abbia inserito tre record, di cui due sono diversi da 'A', la seconda query torna solo 'B'. Aggiungo infatti che il null non lo vedi poiché necessita l'operatore IS (NOT) per essere gestito. Magari la seconda query non ti torna resultset poiché hai NULL nel campo Lettera? In quel caso puoi usare ISNULL o COALESCE, come nell'esempio che segue:

    USE tempdb;
    GO
    
    
    CREATE TABLE #tempLettere (ID int PRIMARY KEY, Lettera varchar(2) NULL)
    GO
    
    INSERT INTO #tempLettere (ID, Lettera) VALUES (1, 'A');
    INSERT INTO #tempLettere (ID, Lettera) VALUES (2, 'B');
    INSERT INTO #tempLettere (ID, Lettera) VALUES (3, NULL);
    
    SELECT     
    	  Lettera
    	, ID
    FROM         
    	#tempLettere
    WHERE     
    	Lettera = 'A';
    
    /*
    Lettera ID
    ------- -----------
    A       1
    */
    
    SELECT     
    	  Lettera
    	, ID
    FROM         
    	#tempLettere
    WHERE     
    	ISNULL(Lettera, '') <> 'A' ;
    
    /*
    Lettera ID
    ------- -----------
    B       2
    */
    
    -- pulizia
    DROP TABLE #tempLettere;
    GO

    Ciao


    Alessandro Alpi SQL Server MVP

    lunedì 19 agosto 2013 17:50
    Moderatore

Tutte le risposte

  • Ciao,

    il prefisso N davanti ad una stringa indica - nel linguaggio SQL - che la stringa stessa è in formato Unicode (ed è quindi da trattare come un campo NCHAR, NVARCHAR o NTEXT). Se devi formulare query che non debbano accedere a set di caratteri particolari, puoi anche omettere il prefisso N.

    Riguardo alle tue query, nel primo caso (N'A') viene richiesto un filtro sul campo Lettera, per tutti i valori uguali ad A. Nel secondo caso, vengono restituiti tutti i valori diversi da A. Formalmente, le due query sono corrette: al limite puoi postare uno stamp di una SELECT fatta su tutta la tabella per vedere se si nota qualcosa di macroscopico.


    Emiliano Musso

    lunedì 19 agosto 2013 11:56
  • Ciao,

    rafforzo quanto dice Emiliano con un esempio:

    USE tempdb;
    GO
    
    
    CREATE TABLE #tempLettere (ID int PRIMARY KEY, Lettera varchar(2) NULL)
    GO
    
    INSERT INTO #tempLettere (ID, Lettera) VALUES (1, 'A');
    INSERT INTO #tempLettere (ID, Lettera) VALUES (2, 'B');
    INSERT INTO #tempLettere (ID, Lettera) VALUES (3, NULL);
    
    SELECT     
    	  Lettera
    	, ID
    FROM         
    	#tempLettere
    WHERE     
    	Lettera = 'A';
    
    /*
    Lettera ID
    ------- -----------
    A       1
    */
    
    SELECT     
    	  Lettera
    	, ID
    FROM         
    	#tempLettere
    WHERE     
    	Lettera <> 'A' ;
    
    /*
    Lettera ID
    ------- -----------
    B       2
    */
    
    -- pulizia
    DROP TABLE #tempLettere;
    GO

    Nonostante abbia inserito tre record, di cui due sono diversi da 'A', la seconda query torna solo 'B'. Aggiungo infatti che il null non lo vedi poiché necessita l'operatore IS (NOT) per essere gestito. Magari la seconda query non ti torna resultset poiché hai NULL nel campo Lettera? In quel caso puoi usare ISNULL o COALESCE, come nell'esempio che segue:

    USE tempdb;
    GO
    
    
    CREATE TABLE #tempLettere (ID int PRIMARY KEY, Lettera varchar(2) NULL)
    GO
    
    INSERT INTO #tempLettere (ID, Lettera) VALUES (1, 'A');
    INSERT INTO #tempLettere (ID, Lettera) VALUES (2, 'B');
    INSERT INTO #tempLettere (ID, Lettera) VALUES (3, NULL);
    
    SELECT     
    	  Lettera
    	, ID
    FROM         
    	#tempLettere
    WHERE     
    	Lettera = 'A';
    
    /*
    Lettera ID
    ------- -----------
    A       1
    */
    
    SELECT     
    	  Lettera
    	, ID
    FROM         
    	#tempLettere
    WHERE     
    	ISNULL(Lettera, '') <> 'A' ;
    
    /*
    Lettera ID
    ------- -----------
    B       2
    */
    
    -- pulizia
    DROP TABLE #tempLettere;
    GO

    Ciao


    Alessandro Alpi SQL Server MVP

    lunedì 19 agosto 2013 17:50
    Moderatore