Colonne calcolate e valori NULL

domenica 07 dicembre 2008 - 11.34

Teech Profilo | Expert

Ho una tabella così creata
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Per comodità vorrei aggiungere una colonna calcolata virtuale in base al campo chiusura: se il campo è NULL la colonna calcolata deve restituire False, per contro deve restiotuire True.
Ho 2 problemi:
1. Ho provato ad inserire la colonna con il calcolo sottostante ma il valore è sempre 'True' sia che il campo Chiusura sia NULL che contenga una data
2. Con il calcolo sottostante mi viene restituito un valore stringa e non un valore bit (almeno credo)...

La colonna ho provato as inserirle nel seguente modo:
[CHIUSA] AS (case [CHIUSURA] when NULL then 'False' else 'True' end)

L'unica cosa che ho capito è che da 1 a 10 questa formula è sbagliata almeno 8

Avete consigli? Grazie!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

lbenaglia Profilo | Guru

>Per comodità vorrei aggiungere una colonna calcolata virtuale
>in base al campo chiusura: se il campo è NULL la colonna calcolata
>deve restituire False, per contro deve restiotuire True.
>Ho 2 problemi:
>1. Ho provato ad inserire la colonna con il calcolo sottostante
>ma il valore è sempre 'True' sia che il campo Chiusura sia NULL
>che contenga una data
>2. Con il calcolo sottostante mi viene restituito un valore stringa
>e non un valore bit (almeno credo)...

Ciao Maurizio,

Osserva il seguente esempio:

USE tempdb; CREATE TABLE dbo.test( Codice varchar(50) NOT NULL, Descrizione varchar(60) NOT NULL, Chiusura datetime NULL, CONSTRAINT PK_test PRIMARY KEY(Codice) ); ALTER TABLE dbo.test ADD Chiusa AS CAST((CASE WHEN [CHIUSURA] IS NULL THEN 0 ELSE 1 END) AS bit) PERSISTED; INSERT dbo.test VALUES ('Codice 1', 'Descrizione 1', NULL) , ('Codice 2', 'Descrizione 2', CURRENT_TIMESTAMP); SELECT * FROM dbo.test; /* Output: Codice Descrizione Chiusura Chiusa --------- -------------- ----------------------- ----------- Codice 1 Descrizione 1 NULL 0 Codice 2 Descrizione 2 2008-12-07 14:08:47.250 1 (2 row(s) affected) */ DROP TABLE dbo.test;

Come certamente saprai il data type booleano bit rappresenta con 1 il valore vero e con 0 il valore falso.
Ho utilizzato la funzione CAST per convertire il risultato dell'espressione in un valore bit.
Inoltre ho specificato la clausola PERSISTED per rendere persistente nel db il valore restituito dalla colonna calcolata, calcolandolo in fase di INSERT/UPDATE rendendo più efficiente le query che specificano tale colonna nella clausola WHERE.

>Avete consigli? Grazie!!!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Teech Profilo | Expert

Funziona perfettamente... Grazie!!!

--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5