Sql IF语句错误

Sql IF语句错误,sql,sql-server,Sql,Sql Server,我在表A中有以下几列 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 但是statment没有编译。它显示无效的列名“C

我在表A中有以下几列

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

但是statment没有编译。它显示无效的列名“Column3”

您需要以下语法

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

希望这是有帮助的

您正在混合两种不同的级别: 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

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

您需要将测试条件与IF子句后面的语句分开。再见


如果要执行此操作,需要首先将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
为什么不直接做呢

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

列3未在IF和ELSE块之外的任何位置被引用。如果希望引用此值,则需要声明一个新变量并使用该变量

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  

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

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)

如果表中的行数超过1行,则从表A中选择@Temp=Column3将失败。这就是为什么我在底部说的原因。显然,这假设Column3只返回一个值。。我在回答中添加了不同的解决方案。建议这样做吗?我读过应该使用的案例陈述。如何使用用例?如果条件列出col2>200的记录,否则列出具有col2@Fran索瓦:也许吧。不可能直接测试条件列表,对吗?
IF (SELECT Column3 FROM @tblTableA) = 0
  SELECT Column1, Column2 FROM   
  @tblTableA WHERE  
  Column2 > 200  
ELSE
  SELECT Column1, Column2 FROM   
  @tblTableA WHERE  
  Column2 < 200  
IF @btColumn3 = 0
BEGIN
  // Do a query
  // Do another
END
ELSE
BEGIN
  // Do a query
  // Do another
END
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)