我在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'
答案 0 :(得分:3)
在IF
和ELSE
块之外的任何位置都没有引用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()
等取决于根据您的要求。
此外,如果您需要在IF
和ELSE
块中执行多个查询,则需要将内容包装在BEGIN
和END
中,如下所示:
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)