Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

campi NULL e BLANK ( vuoti)

8,265 views
Skip to first unread message

Gerry

unread,
Dec 14, 2010, 10:34:14 AM12/14/10
to
MS SQL SERVER 2005 : in una tabella alcuni campi anzichč contenere il
valore NULL , sono vuoti ( bianchi).

Quindi la mia condizione Where [nomecampo] is not NULL non funziona in
tali casi .


Mi chiedevo come risolvere: impostare prima una query che inserisca NULL
dove non vi č alcun dato ( č possibile? ) , oppure se conoscete una
sintassi che consideri i campi in bianco.

Buonasera


Giacomo Degli Esposti

unread,
Dec 14, 2010, 10:56:48 AM12/14/10
to
On 14 Dic, 16:34, "Gerry" <s...@tryr.iu> wrote:
> MS SQL SERVER 2005 : in una tabella alcuni campi anzich contenere  il

> valore NULL   , sono vuoti ( bianchi).
>
> Quindi la mia condizione  Where  [nomecampo] is not NULL   non funziona in
> tali casi .
>
> Mi chiedevo come risolvere:  impostare prima una query che inserisca NULL
> dove non vi alcun dato ( possibile? )  , oppure se conoscete una

> sintassi che consideri i campi in bianco.

Ciao,

immagino che bianchi significhi che sono stringhe vuote... in questo
caso
puoi usare

where [nomecampo] <> ''

Se hai campi in cui in certe righe hai null e in altre hai '' puoi
scrivere

where isnull( [nomecampo], '') <> ''

(sconsigliabile in quanto le performance calano parecchio perche non
riuscirebbe ad usare eventuali indici)

ciao
Giacomo


Gerry

unread,
Dec 14, 2010, 11:40:41 AM12/14/10
to

<immagino che bianchi significhi che sono stringhe vuote... in questo
<caso
<puoi usare

<where [nomecampo] <> ''

<Se hai campi in cui in certe righe hai null e in altre hai '' puoi
<scrivere

<where isnull( [nomecampo], '') <> ''

non dovresti usare l'operatore OR ?


Ad esempio se volessi selezionare le righe con il campo NULL oppure con il
campo VUOTO :

Where ( ( [nomecampo] is NULL ) OR ( [nomecampo] ='' ) )


Giacomo Degli Esposti

unread,
Dec 14, 2010, 12:35:01 PM12/14/10
to
On 14 Dic, 17:40, "Gerry" <s...@tryr.iu> wrote:
[...]

> <where isnull( [nomecampo], '') <> ''
>
> non dovresti usare l'operatore OR ?
>
> Ad esempio se volessi selezionare  le righe con il campo NULL oppure con il
> campo VUOTO :
>
> Where ( ( [nomecampo] is  NULL  )  OR (  [nomecampo] ='' ) )

Si puoi fare anche cosi' (pure meglio perche e' sql standard e non usi
funzioni
specifiche di MSSQL :)

ciao
Giacomo

David Martin

unread,
Dec 15, 2010, 3:30:47 AM12/15/10
to
On 12/14/2010 05:40 PM, Gerry wrote:

>> <where isnull( [nomecampo], '') <> ''
>
> non dovresti usare l'operatore OR ?
> Ad esempio se volessi selezionare le righe con il campo NULL oppure con il
> campo VUOTO :
> Where ( ( [nomecampo] is NULL ) OR ( [nomecampo] ='' ) )

Sono due istruzioni diverse, quella che hai scritto tu e quella che ti
aveva proposto Giacomo.
Vanno bene entrambe, quindi non è che "dovresti" usare l'OR,
semplicemente hai la possibilità di usare entrambe le sintassi.
Quella di Giacomo però è specifica di SQL Server, in Mysql dovresti
usare IFNULL al posto di ISNULL.

Attenzione però che NULL e "stringa vuota" non hanno nulla a che vedere
l'uno con l'altro...

--
David Martin

Gerry

unread,
Dec 15, 2010, 7:04:13 AM12/15/10
to

>
> Attenzione però che NULL e "stringa vuota" non hanno nulla a che vedere
> l'uno con l'altro...

con Microsoft sql server ho fatto questa interessante scoperta : se il
campo [data_documento] ammette valori blanck ( oltre che valori NULL )
allora l'istruzione

where ( ([data_documento] is not null ) OR ([data_documento] <>'')

ha significato , cioè distingue i due valori ( null e blanck) ;

se invece il campo non ammette valori blanck ( a causa di un vincolo) ,
l'istruzione riportata è perfettamente equivalente a questa

where ( ([data_documento] is not null )


In tale secondo caso ( il campo non ammette valori blanck ) il risultato è
sorprendente , in quanto l'struzione :

where ( ([data_documento] is not null ) OR ([data_documento] <>'')

non dovrebbe filtrare alcunchè in quanto è sempre vera!

Invece esclude i campi NULL !

Vi risulta?

Ciao

David Martin

unread,
Dec 15, 2010, 8:06:07 AM12/15/10
to
On 12/15/2010 01:04 PM, Gerry wrote:

> se invece il campo non ammette valori blanck ( a causa di un vincolo) ,
> l'istruzione riportata è perfettamente equivalente a questa
>
> where ( ([data_documento] is not null )
>
>
> In tale secondo caso ( il campo non ammette valori blanck ) il risultato è
> sorprendente , in quanto l'struzione :
>
> where ( ([data_documento] is not null ) OR ([data_documento] <>'')
>
> non dovrebbe filtrare alcunchè in quanto è sempre vera!

Se mi spieghi il motivo per cui dovrebbe essere sempre vera, ti rispondo.


> Invece esclude i campi NULL !

Beh, gliel'hai detto tu di escludere i valori NULL, scrivendo WHERE
campo IS NOT NULL.

Ripeto quanto ho scritto nell'altro post: i NULL non hanno niente a che
vedere con il campo "vuoto".

--
David Martin

Gerry

unread,
Dec 15, 2010, 8:33:09 AM12/15/10
to
>> where ( ([data_documento] is not null ) OR ([data_documento] <>'')
>>
>> non dovrebbe filtrare alcunchè in quanto è sempre vera!
>
> Se mi spieghi il motivo per cui dovrebbe essere sempre vera, ti rispondo.


il secondo elemento dell'OR è sempre vero ( tutte le date ovviamente non
sono blanck,proprio per via del vincolo presente sul campo) ;

e siccome F OR V = V

e V OR V = V

la clausola WHERE diventa manifestamente inutile.


>
> Beh, gliel'hai detto tu di escludere i valori NULL, scrivendo WHERE
> campo IS NOT NULL.

no , io messo la condizione WHERE ( F OR V )


> Ripeto quanto ho scritto nell'altro post: i NULL non hanno niente a che
> vedere con il campo "vuoto".


questo è vero , ai fini delle query, solo se il campo ammette valori Blanck;
altrimenti null e blanck sono indistinguibili .


Gerry

unread,
Dec 15, 2010, 8:35:30 AM12/15/10
to

>
> questo è vero , ai fini delle query, solo se il campo ammette valori
> Blanck;
> altrimenti null e blanck sono indistinguibili .


infatti se il campo ammette valori blanck , le condizioni

where [nomecampo] <> ''

e

where [nomecampo] is not null

sono diverse , e filtrano record diversi.

Paolo opg

unread,
Dec 15, 2010, 8:48:28 AM12/15/10
to
"Gerry" <s...@tryr.iu> wrote in news:ieaart$oav$1...@nnrp-beta.newsland.it:

>
>
>>
>> Attenzione però che NULL e "stringa vuota" non hanno nulla a che
>> vedere l'uno con l'altro...
>
>
>
> con Microsoft sql server ho fatto questa interessante scoperta : se
> il campo [data_documento] ammette valori blanck ( oltre che valori
> NULL ) allora l'istruzione
>
> where ( ([data_documento] is not null ) OR ([data_documento] <>'')
>
> ha significato , cioè distingue i due valori ( null e blanck) ;
>
> se invece il campo non ammette valori blanck ( a causa di un vincolo)
> , l'istruzione riportata è perfettamente equivalente a questa
>
> where ( ([data_documento] is not null )
>

se il campo data ammette valori blank (dove blank = '') imo c'e' qualcosa
che non quadra, perche' a meno di esigenze particolari e necessita'
stringenti, un campo data su mssql dovrebbe essere di tipo smalldatetime
o datetime.

e in quel tipo dati una stringa non ci entra proprio...


>
> In tale secondo caso ( il campo non ammette valori blanck ) il
> risultato è sorprendente , in quanto l'struzione :
>
> where ( ([data_documento] is not null ) OR ([data_documento] <>'')
>
> non dovrebbe filtrare alcunchè in quanto è sempre vera!
>
> Invece esclude i campi NULL !
>
> Vi risulta?
>
> Ciao
>
>
>


a naso a me sembra il comportamento previsto.

http://www.devx.com/vb2themax/Tip/18541


--
Paolo opg

BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

Lucazeo

unread,
Dec 15, 2010, 9:14:48 AM12/15/10
to
On 14 Dic, 18:35, Giacomo Degli Esposti

Più standard: where COALESCE( [nomecampo], '') <> ''
Però su sqlserver, stando alla documentazione, ISNULL è più
performante.
Personalmente penso che sia irrilevante creare applicazioni che magari
sono custom, pensando alla portabilità del db: non sfrutteresti mai
fino in fondo l'engine del db. Ma questo è un altro discorso.

> ciao
> Giacomo

Ciao,

Lucazeo.

David Martin

unread,
Dec 15, 2010, 9:26:26 AM12/15/10
to
On 12/15/2010 02:33 PM, Gerry wrote:

> il secondo elemento dell'OR è sempre vero ( tutte le date ovviamente non
> sono blanck,proprio per via del vincolo presente sul campo) ;

Scusa, mi son un attimo perso e non mi ero ricordato che stavamo
parlando di campi di tipo data.

Tuttavia, quello che scrivi non mi convince: posta lo script di
creazione della tabella, almeno un paio di record di test e poi le
istruzioni di selezione, che vediamo di riprodurre il "problema".

A quanto mi risulta, nei campi di tipo 'data' non esiste in blank... il
campo è NULL oppure ha un valore che hai definito tu oppure ha il valore
'1900-01-01 00:00.000'.

Se hai una tabella con un campo di tipo 'date' e inserisci il valore
"blank" '', quindi fai una select, il motore ti restituisce la data
'1900-01-01'.


>> Ripeto quanto ho scritto nell'altro post: i NULL non hanno niente a che
>> vedere con il campo "vuoto".
>
> questo è vero , ai fini delle query, solo se il campo ammette valori Blanck;
> altrimenti null e blanck sono indistinguibili .

Non bestemmiamo per favore. :-)
NULL e blank sono cose completamente diverse, punto.

--
David Martin

Gigi

unread,
Dec 15, 2010, 10:18:01 AM12/15/10
to

> Tuttavia, quello che scrivi non mi convince: posta lo script di
> creazione della tabella, almeno un paio di record di test e poi le
> istruzioni di selezione, che vediamo di riprodurre il "problema".

purtroppo lavoro su un database fatto da altri,io mi sto limitando a
modificarlo tramite query , e mi sono accorto appunto del differente
comportamento per le colonne di tipo data rispetto ad altre colonne che
ammettono valori blanck.

Grazie comunque

Ciao


David Martin

unread,
Dec 15, 2010, 10:47:07 AM12/15/10
to

Beh, anche se il db è di altri, non puoi vedere qual'è la struttura?

Fino a prova contraria, la mia opinione è che c'è qualcosa che sfugge a
te e non a SQL Server...

--
David Martin

Gerry

unread,
Dec 15, 2010, 11:18:30 AM12/15/10
to
>
> Fino a prova contraria, la mia opinione è che c'è qualcosa che sfugge a
> te e non a SQL Server...


segue la struttura della tabella ( CG.TESTA )su cui eseguo le query .

le query eseguite sul campo [Data_Documento] non distinguono tra valore NULL
e '' , mentre invece quelle eseguite sul campo [ID_RegIVA] sì.


Ciao


USE [database]

GO

/****** Oggetto: Table [dbo].[CG_Testa] Data script: 12/15/2010 17:14:44
******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_PADDING ON

GO

CREATE TABLE [dbo].[CG_Testa](

[ID_Azione_Ins] [int] NULL,

[ID_Azione_Mod] [int] NULL,

[N_IDAzienda] [int] NOT NULL,

[ID_Movim_CG] [int] NOT NULL,

[Tipo_Movimento] [varchar](1) NULL,

[Data_Registrazione] [datetime] NULL,

[Data_Comp_Esercizio] [datetime] NULL,

[Data_Comp_LiqIVA] [datetime] NULL,

[Data_Documento] [datetime] NULL,

[Num_Documento] [varchar](10) NULL,

[ID_Causale] [varchar](4) NULL,

[Descrizione] [varchar](40) NULL,

[ID_Provvisorio] [varchar](2) NULL,

[ID_Tipo_Pagamento] [varchar](1) NULL,

[ID_Pagamento] [varchar](3) NULL,

[ID_RegIVA] [varchar](2) NULL,

[Prot_IVA] [varchar](10) NULL,

[ID_Immagine] [int] NULL,

[ID_RegIVA_Vendite] [varchar](2) NULL,

[Prot_IVA_Vendite] [varchar](10) NULL,

[Prog_Stampa_RU] [int] NULL,

[Pag_Stampa_RU] [int] NULL,

[ID_Attivita] [varchar](2) NULL,

[ID_Filiale] [varchar](2) NULL,

CONSTRAINT [PK_CG_Testa] PRIMARY KEY CLUSTERED

(

[N_IDAzienda] ASC,

[ID_Movim_CG] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

GO

SET ANSI_PADDING OFF


David Martin

unread,
Dec 15, 2010, 12:41:18 PM12/15/10
to
On 12/15/2010 05:18 PM, Gerry wrote:

> segue la struttura della tabella ( CG.TESTA )su cui eseguo le query .
>
> le query eseguite sul campo [Data_Documento] non distinguono tra valore NULL

> e '' , mentre invece quelle eseguite sul campo [ID_RegIVA] s�.

Sinceramente temo tu abbia una gran confusione in testa riguardo a
questo argomento...


I campi di tipo stringa (nel tuo caso [ID_RegIVA]), e NULLABLE,
ammettono i seguenti valori:
1. NULL
2. un valore specificato dall'utente (o un default).
In questa seconda categoria rientra il campo "vuoto".

I campi di tipo data/ora (nel tuo caso [Data_Documento]), e NULLABLE,
ammettono i seguenti valori:
1. NULL
2. un valore specificato dall'utente (o un default).
Non puoi inserire una "data vuota".
Come gi� indicato in un altro post, se in una data tu inserisci il
valore '', SQL Server memorizza la sua data iniziale '1970-01-01 00:00.000'.


Quindi, dire "query eseguite sul campo [Data_Documento] non distinguono
tra valore NULL e ''" � una bestemmia.
Il valore '' su una data significa '1970-01-01 00:00.000'.


Se invece parliamo di campi stringa (es. char e varchar), il valore ''
ha senso e significa esattamente "stringa vuota".
Per�, la clausola "where ([campo_stringa] is not null ) OR
([campo_stringa] <> '')" � giusto che escluda i NULL, perch� i NULL non
soddisfano ne il primo confronto (is not null) ne il secondo (<> '').

--
David Martin

Lorenzo Benaglia

unread,
Dec 15, 2010, 5:29:39 PM12/15/10
to
"David Martin" wrote:
> Come già indicato in un altro post, se in una data tu inserisci il

> valore '', SQL Server memorizza la sua data iniziale '1970-01-01
> 00:00.000'.

1970?!

SELECT CAST('' AS datetime)

/* Output:

-----------------------
1900-01-01 00:00:00.000

(1 row(s) affected)

*/

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://social.microsoft.com/Forums/it-IT/sqlserverit

David Martin

unread,
Dec 16, 2010, 2:15:13 AM12/16/10
to
On 12/15/2010 11:29 PM, Lorenzo Benaglia wrote:
> "David Martin" wrote:
>> Come già indicato in un altro post, se in una data tu inserisci il
>> valore '', SQL Server memorizza la sua data iniziale '1970-01-01
>> 00:00.000'.
>
> 1970?!

Porcaccia miseria, mi hai subito sgamato :-)

La colpa non è mia, è di mysql che ha come "data di inizio" (passatemi
il termine) il 01-01-1970 :-P

--
David Martin

Pablo

unread,
Dec 16, 2010, 2:37:10 AM12/16/10
to
Il 16/12/2010 08:15, David Martin ha scritto:
> La colpa non è mia, è di mysql che ha come "data di inizio" (passatemi
> il termine) il 01-01-1970 :-P

Non è MySQL, è "Unix time" (o "Unix epoch"), usato in buona parte dei
linguaggi di programmazione, conseguentemente anche in molti db.
Se non ricordo male però l'SQL ha come "data zero" il "01/01/1900".

0 new messages