CASE SUL WHERE..

martedì 21 ottobre 2008 - 11.49

stepic77 Profilo | Newbie

Devo eseguire una select come questa ma credo non si possa fare...

CREATE TABLE #PROVA( ID SMALLINT, NOME VARCHAR(25), TITOLO SMALLINT ) INSERT INTO #PROVA VALUES(1,'PIPPO',1) INSERT INTO #PROVA VALUES(1,'PAPERINO',2) INSERT INTO #PROVA VALUES(1,'TOPOLINO',1) DECLARE @PROFILI SMALLINT SET @PROFILI = 1 SELECT NOME FROM #PROVA WHERE TITOLO CASE WHEN @PROFILI = 1 THEN IN(1) ELSE IN(1,2) END DROP TABLE #PROVA

C'è modo di aggirare il problema nella stessa select

lbenaglia Profilo | Guru

>C'è modo di aggirare il problema nella stessa select
No, fai 2 SELECT.

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

Wamba Profilo | Expert

Ciao, Ho provato ad aggirare il problema trasformando il tuo case in una logica corrsipondente
Il risultato della query è
PIPPO
TOPOLINO

CREATE TABLE #PROVA( ID SMALLINT, NOME VARCHAR(25), TITOLO SMALLINT )

INSERT INTO #PROVA VALUES(1,'PIPPO',1)
INSERT INTO #PROVA VALUES(1,'PAPERINO',2)
INSERT INTO #PROVA VALUES(1,'TOPOLINO',1)

DECLARE @PROFILI SMALLINT
SET @PROFILI = 1

SELECT NOME
FROM #PROVA
WHERE
((@PROFILI = 1)AND TITOLO IN (1))
OR((@PROFILI <> 1)AND TITOLO IN (1,2))

DROP TABLE #PROVA
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

lbenaglia Profilo | Guru

> WHERE
> ((@PROFILI = 1)AND TITOLO IN (1))
> OR((@PROFILI <> 1)AND TITOLO IN (1,2))

Il piano di esecuzione di una simile clausola WHERE sarà tremendo
In questi casi è meglio semplificare scrivendo 2 query distinte, meglio se incapsulate in una bella stored procedure.

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

Wamba Profilo | Expert

mmm, quella che mi dai non è una bella notizia .

Spesso uso questa tecnica in alcune stored di select con filtri opzionali.
Tipo parametro della stored
@FiltraPerCampoIntero int = -1

e poi nella clasuola where
AND ((@FiltraPerCampoIntero = -1) OR (TAB.CampoIntero = @FiltraPerCampoIntero))

Non mi ero mai reso conto di rallentamenti anche se la quantità di dati trattati non è mai eccessiva, massimo un centinaio di record x 10/15 campi.
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5