15 messaggi dal 15 febbraio 2007
E' possibile inserire un IF in una query????
Ho la seguente necessita di estrazione dati;
"Select campo1 from tabella1"
se questo campo è true devo estrarre anche il campo2
se questo campo è false devo estrarre anche il campo3
non vorrei fare dei cicli in quanto vista la qta dei dati potrebbero impiegare molto tempo

.......GRAZIE......
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
max74 ha scritto:
E' possibile inserire un IF in una query????
Ho la seguente necessita di estrazione dati;
"Select campo1 from tabella1"
se questo campo è true devo estrarre anche il campo2
se questo campo è false devo estrarre anche il campo3
non vorrei fare dei cicli in quanto vista la qta dei dati potrebbero impiegare molto tempo

.......GRAZIE......


questo verrebbe a definire un comando SQL Dinamico (http://www.sommarskog.se/dynamic_sql.html) visto che la lista delle colonne coinvolte nella proiezione deve essere costante e non definita a runtime.. e chiaramente, a meno di non eseguire (appunto) del codice dinamico, la cosa non e' possibile..
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
1.976 messaggi dal 27 luglio 2005
Contributi
forse ho male interpretato..
>se questo campo è true devo estrarre anche il campo2
>se questo campo è false devo estrarre anche il campo3
>...
non so bene come proceda questa "operazione".. se e' una semplice "sostituzione" di fattore, nel senso che, in base alla valutazione di una condizione (su un attributo) verra' restituito un altro attributo diverso, e quindi la colonna sara' sempre valorizzata (e quindi esistente), rimanendo quindi costante il numero di colonne della proiezione finale, allora si puo' anche fare...
nel senso che
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.TestTB(
Id int NOT NULL,
colCheck int NOT NULL,
Col2 varchar(5) NOT NULL,
Col3 char(5) NOT NULL,
Col4 datetime NOT NULL,
Col5 int NOT NULL
);
GO
INSERT INTO dbo.TestTB VALUES ( 1 , 1, 'si', 'no', GETDATE(), 0 );
INSERT INTO dbo.TestTB VALUES ( 2 , 2, 'no', 'si', GETDATE(), 0 );
INSERT INTO dbo.TestTB VALUES ( 3 , 3, 'no', 'no', GETDATE(), 0 );
INSERT INTO dbo.TestTB VALUES ( 4 , 4, 'no', 'no', GETDATE(), 1 );

SELECT t.Id, t.ColCheck,
CASE WHEN t.ColCheck = 1 THEN Col2
WHEN t.ColCheck = 2 THEN Col3
WHEN t.ColCheck = 3 THEN CONVERT(varchar, col4)
WHEN t.ColCheck = 4 THEN CONVERT(varchar, col5)
END AS [Result]
FROM dbo.TestTB t;
GO
DROP TABLE dbo.TestTB;
--<--------
Id ColCheck Result
----------- ----------- ------------------------------
1 1 si
2 2 si
3 3 Apr 21 2007 12:52AM
4 4 1

in effetti non modifica il numero delle colonne, che resta "fisso" nel resultset, ovvero la proiezione, ma viene in effetti modificata la proiezione finale nella colonna restituita in base alla valutazione condizionale effettuata dall'espressione CASE.. il tipo di dato restituito per la colonna deve essere lo stesso e deriva da una apposita conversione esplicita ovvero da un'eventuale conversione implicita (con possibilita' anche che possa fallire  ) a meno di non castare, nel caso di SQL Server, il tutto in una colonna di tipo sql_variant, che manterra' il tipo di dato originale dell'attributo di origine..

nel caso invece la proiezione finale risultasse in 2 colonne per la prima riga, 3 colonne per la seconda riga, 4 colonne per la terza riga e via di seguito, allora chiaramente non si puo' fare..
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.