Sql IF语句错误
我在表A中有以下几列 TableA Column1 varchar Column2 int Column3 bit 我用的是这句话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
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)