IF语句错误

时间:2010-05-26 06:53:25

标签: sql sql-server

我在TableA中有以下列

TableA  
Column1 varchar  
Column2 int  
Column3 bit  

我正在使用此声明

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

但是这个声明没有编译。它表示无效的列名称'Column3'

7 个答案:

答案 0 :(得分:3)

IFELSE块之外的任何位置都没有引用Column3。如果您希望引用此值,则需要声明一个新变量并使用它;

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  

或者执行以下操作;

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

无论哪种方式,您都必须确保用于检索Column3的查询通过限制查询来返回单个结果,以便它只能返回单个值或使用MIN()MAX()等取决于根据您的要求。

此外,如果您需要在IFELSE块中执行多个查询,则需要将内容包装在BEGINEND中,如下所示:

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

答案 1 :(得分:1)

你混合了两个不同的级别:
  IF处于TSQL(过程)级别,不能依赖行值
  SELECT是查询本身,其中行值可用于过滤结果集

以下内容可行

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

答案 2 :(得分:1)

如果要执行此操作,则需要先将Column3的值存储在变量中。

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

显然,这假设Column3只返回一个值。

编辑:

这是一种我认为适合您的不同方法:

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

答案 3 :(得分:0)

您需要以下语法

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

希望这有用!!

答案 4 :(得分:0)

假设您已发布完整查询,那么您的IF子句的问题在于您假设它可以使用其后面的SELECT语句中的列。它不能也不能。这就是为什么它不会编译。

您需要将测试条件与IF子句后面的语句分开。请参阅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

答案 5 :(得分:0)

为什么不做呢

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

或者,滥用算术,

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

答案 6 :(得分:0)

由于您的问题的答案在很大程度上取决于必须实施什么逻辑,所以我可以给您分析当前场景是一个小而紧凑的查询,可以满足您的要求(我希望如此......)

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)