2010-05-26 164 views
2

我在表A以下幾列IF語句錯誤

 
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不能編譯。它說無效的列名稱「欄3」

回答

0

您需要的語法如下

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

希望這是有幫助的!

1

你混合2個不同的層次:
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 
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 
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 
+0

'Select @Temp = Co如果表格中有多於一行,lumn3從TableA'將失敗。 – Oded 2010-05-26 07:04:12

+0

這就是爲什麼我在底部說「顯然,這假設只有一個值返回Column3。」。我爲我的答案添加了不同的解決方案。 – codingbadger 2010-05-26 07:16:13

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 
+0

這是推薦的嗎?我應該使用Case語句。如何使用CASE? – Jasl 2010-05-26 07:09:20

+0

這不會產生與'如果條件列出col2> 200的記錄相同的結果,否則列出那些col2 <200'的結果。你會得到一個混合包;但也許這是OP想要的? – 2010-05-26 07:15:24

+0

@弗朗索瓦:也許吧。直接測試條件列表是不可能的? – kennytm 2010-05-26 07:17:34

3

Co lumn3沒有被引用在IFELSE塊之外的任何地方。如果你想引用這個值,你將需要聲明一個新變量並使用它;

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 

無論哪種方式,你將不得不確保用於檢索欄3的查詢或者通過限制你的查詢返回一個結果,這樣它只能返回一個值或使用MIN()MAX()等根據您的要求。

另外,如果你需要的IFELSE塊內執行多​​個查詢您需要包裝在BEGIN內容和END如下:

IF @btColumn3 = 0 
BEGIN 
    // Do a query 
    // Do another 
END 
ELSE 
BEGIN 
    // Do a query 
    // Do another 
END 
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)