2013-06-17 2 views
0

je l'decitiontree suivante:plage Assigner à variable en utilisant entre

declare @placeholder varchar(20) 

If @Number1 = 1 
AND @Number2 = 0 
BEGIN SET @placeholder = 'NULL' 
END 
ELSE IF @Number1 = 1 
AND @Number2 > 0 
BEGIN SET @placeholder = Between (@Number2*10) AND (@Number2*10+9) 
END 
ELSE 
BEGIN 
SET @placeholder = @Othervariable 
END 

J'ai besoin de la variable pour la requête:

SELECT * FROM Table 
WHERE @Placeholder is null or ID = @placeholder. 

Mais la partie 'entre' ne fonctionne pas. Est-ce que quelqu'un peut m'aider?

Répondre

1

Cela ne fonctionnera pas dans le serveur SQL - il n'y a pas de type de variable qui contienne quelque chose comme l'expression lambda, disons Between (@Number2*10) AND (@Number2*10+9).

Une façon est de stocker ceci dans une chaîne (par exemple, nvarchar (max)) et d'exécuter en utilisant exec() ou sp_executesql().

L'autre façon (généralement plus optimisée) consiste à former l'expression principale pour inclure des sous-expressions avec des critères d'exclusion.

Voici un exemple:

DECLARE @Number1 int = 1 -- input variable 1 
DECLARE @Number2 int = 1 -- input variable 2 
DECLARE @excl1 bit = 0 -- exclusion criteria 1 (ec1) 
DECLARE @excl2 bit = 0 -- exclusion criteria 2 (ec2) 

-- fill excl. crit. 
SET @excl1 = CASE WHEN @Number1 = 1 AND @Number2 = 0 THEN 1 ELSE 0 END 
SET @excl2 = CASE WHEN @Number1 = 1 AND @Number2 > 0 THEN 1 ELSE 0 END 

-- just output to see what's happening 
PRINT @Number1 
PRINT @Number2 
PRINT @excl1 
PRINT @excl2 

SELECT * 
FROM Table 
WHERE 
    -- if ec1 is active, we apply sub-expression 1 
    (@excl1 = 0 OR 
    (@excl1 = 1 AND ID IS NULL)) 
    AND 
    -- if ec2 is active, we apply sub-expression 2 
    (@excl2 = 0 OR 
    (@excl2 = 1 AND ID BETWEEN @Number2 * 10 AND @Number2 * 10 + 9)) 
+0

Salut Ozren! Greate et solution intelligente, merci. Je n'ai qu'une seule question, que va-t-il se passer, quand excl1 AND excel2 sont tous les deux '0'? – ruedi

+0

Rien ne sera exclu, ce qui signifie que tout sera sélectionné dans 'Table' – OzrenTkalcecKrznaric

+0

ah ok! grand merci! – ruedi

Questions connexes