2010-05-26 5 views
2

Je les colonnes suivantes TableAen cas d'erreur de déclaration

 
TableA 
Column1 varchar 
Column2 int 
Column3 bit 

J'utilise cette déclaration

IF Column3 = 0 
    SELECT Column1, Column2 FROM 
    TableA WHERE 
    Column2 > 200 
ELSE 
    SELECT Column1, Column2 FROM 
    TableA WHERE 
    Column2 < 200 

Mais le statment ne compile pas. Il dit Nom incorrect de la colonne « Colonne3 »

Répondre

0

Vous aurez besoin de la syntaxe comme suit

IF <CONDITION> 
BEGIN 
    <Your Statement> 
END 
ELSE 
    <Your Statement> 

Espérons que cela est utile !!

1

Vous mélangez 2 niveaux différents:
IF est au niveau et ne peut pas dépendre de la ligne des valeurs
SELECT est la requête elle-même, où les valeurs de ligne TSQL (procédure) peuvent être utilisés pour filtrer le jeu de résultats

qui suit travaillerait

IF Condition /* independent of the different values of TableA. can be an aggregate though */ 
BEGIN 
    SELECT Column1, Column2 FROM 
    TableA WHERE 
    Column2 > 200 
END 
ELSE 
BEGIN 
    SELECT Column1, Column2 FROM 
    TableA WHERE 
    Column2 < 200 
END 
0

en supposant que vous avez posté la requête complète, le problème avec votre clause IF est que vous assumez qu'il peut utiliser les colonnes de l'instruction SELECT le suivant. Cela ne peut pas et ne le fait pas. C'est pourquoi il ne compilera pas.

Votre condition de test doit être distincte des instructions suivant la clause IF. Voir sur MSDN.

DECLARE @test BIT 
SELECT @test = 0 

IF @test = 0 
BEGIN 
    SELECT Column1, Column2 FROM 
    TableA WHERE 
    Column2 > 200 
END 
ELSE 
BEGIN 
    SELECT Column1, Column2 FROM 
    TableA WHERE 
    Column2 < 200 
END 
1

Si vous voulez faire cela, vous devez d'abord stocker la valeur de Column3 dans une variable.

Declare @temp money 

Select @Temp = Column3 
From TableA 


IF @Temp = 0 

begin 
    SELECT Column1, Column2 FROM 
    TableA WHERE 
    Column2 > 200 
end 
ELSE 
begin 
    SELECT Column1, Column2 FROM 
    TableA WHERE 
    Column2 < 200 
end 

Évidemment, cela suppose qu'il n'y aura qu'une seule valeur retournée pour la colonne 3.

EDIT:

Ceci est une autre approche que je pense, devrait travailler pour vous:

declare @CutOffValue money 
declare @MaxValue money 

Set @CutOffValue = 200 
Set @MaxValue = 9999999999 

Select Column1, Column2 
From TableA 
Where Column2 > Case When Column3 = 0 Then @CutOffValue Else 0 End 
And Column2 < Case When Column3 = 0 Then @MaxValue Else @CutOffValue End 
+0

'Select @Temp = Co lumn3 De TableA' échouera s'il y a plus d'une rangée dans la table. – Oded

+0

C'est pourquoi j'ai dit en bas "Evidemment, cela suppose qu'il n'y aura qu'une seule valeur retournée pour Colonne3.". J'ai ajouté une solution différente à ma réponse. – codingbadger

0

Pourquoi ne pas faire seulement

select Column1, Column2 from TableA where 
    Column2 > 200 and Column3 = 0 or Column2 < 200 and Column3 = 1 

ou, abusant Arithmétique,

select Column1, Column2 from TableA where (Column2 - 200) * (2 * Column3 - 1) < 0 
+0

Est-ce recommandé de faire? Je lis les énoncés de cas devraient être utilisés. Comment faire avec CASE? – Jasl

+0

Cela ne donnerait pas le même résultat que si la liste de conditions contenait les enregistrements pour col2> 200 sinon ceux avec col2 <200'. Vous obtiendriez un sac mélangé; mais peut-être que c'est ce que l'OP voulait? –

+0

@ François: Peut-être. Il n'est pas possible de tester directement une liste de conditions? – kennytm

3

Co Lumn3 n'est référencé nulle part en dehors des blocs IF et ELSE. Si vous souhaitez référencer cette valeur, vous devrez déclarer une nouvelle variable et l'utiliser;

DECLARE @btColumn3 BIT 

SELECT @btColumn3 = Column3 FROM @tblTableA 

IF @btColumn3 = 0 
    SELECT Column1, Column2 FROM 
    @tblTableA WHERE 
    Column2 > 200 
ELSE 
    SELECT Column1, Column2 FROM 
    @tblTableA WHERE 
    Column2 < 200 

Ou procédez comme suit;

IF (SELECT Column3 FROM @tblTableA) = 0 
    SELECT Column1, Column2 FROM 
    @tblTableA WHERE 
    Column2 > 200 
ELSE 
    SELECT Column1, Column2 FROM 
    @tblTableA WHERE 
    Column2 < 200 

De toute façon, vous devez vous assurer que la requête utilisée pour récupérer Colonne3 retourne un seul résultat, soit en limitant votre requête afin qu'il ne peut renvoyer une valeur unique ou à l'aide MIN(), MAX() etc en fonction de vos besoins.

En outre, si vous avez besoin d'exécuter plus d'une requête dans les IF et ELSE blocs que vous aurez besoin d'envelopper le contenu dans BEGIN et END comme suit:

IF @btColumn3 = 0 
BEGIN 
    // Do a query 
    // Do another 
END 
ELSE 
BEGIN 
    // Do a query 
    // Do another 
END 
0

Depuis la réponse à votre problème varie en grande partie sur exactement quelle logique doit être mise en œuvre, l'analyse du scénario actuel tout ce que je peux vous donner est une requête petite et compacte qui peut répondre à vos besoins (je l'espère ...)

SELECT Column1,column2 FROM TableA WHERE 
(CASE WHEN Column3=0 then Column2 else 2)>(CASE WHEN Column3=0 then 200 ELSE 1) 
AND (CASE WHEN Column3<>0 then Column2 else 1)<(CASE WHEN Column3<>0 then Column2 else 2) 
Questions connexes