2012-04-02 67 views
-1

我想把CASE語句放在Where子句中,但是我收到錯誤:「>」附近的語法錯誤。CASE聲明在Where子句中? '>'附近語法不正確

WHERE 
[email protected] 
AND AuctionStatus=1 
AND SE_UsersMain.isActive=1 
AND [email protected] 
AND  
CASE      
WHEN @CompareSign=1 THEN @CurrentAmount>@FilterAmount 
WHEN @CompareSign=2 THEN @CurrentAmount<@FilterAmount 
WHEN @CompareSign=3 THEN @[email protected] 
END 

非常感謝。

+0

你想用這個做什麼? – 2012-04-02 11:14:49

+0

查詢對我來說沒有多大意義,除非CurrentAmount是列而不是參數。你確定這不是一個錯字嗎? – 2012-04-02 11:15:25

回答

3

試試這個:

WHERE ItemCategoryID  = @CategoryID 
AND AuctionStatus   = 1 
AND SE_UsersMain.isActive = 1 
AND AuctionOwner!   = @OwnerID 
AND 
    CASE 
     WHEN @CompareSign = 1 AND @CurrentAmount>@FilterAmount THEN '1' 
     WHEN @CompareSign = 2 AND @CurrentAmount<@FilterAmount THEN '1' 
     WHEN @CompareSign = 3 AND @[email protected] THEN '1' 
     ELSE '0' 
    END = '1' 
+0

離開撇號會很好。那麼你會處理整數而不是字符串。 – HABO 2012-04-02 12:57:44

+0

@ user92546你是否期望在處理單字符常量時有很大的不同? – 2012-04-02 17:11:23

+0

@AaronBertrand - 我希望它能夠對C(及其衍生物)的編程人員產生巨大的影響,他們會做任何事情來保存源代碼的特徵。純粹主義者可以選擇將CAST整數轉換爲BIT值,或者使用聲明的變量作爲值。就運行時性能而言,衡量差異如此微不足道會是一項挑戰。我深切感謝您對我的可能期望的關注。非常感謝您的詢問。 – HABO 2012-04-02 17:37:59

1

CASE是一個表達式,它返回單個值,而不是流控制語句。實現這個最簡單的方法很可能是動態SQL:

DECLARE @sql NVARCHAR(MAX); 
SET @sql = N'SELECT ...'; 

SET @sql = @sql + ' WHERE 
ItemCategoryID=$c$ 
AND AuctionStatus=1 
AND SE_UsersMain.isActive=1 
AND AuctionOwner!=$o$ 
AND $ca$ $sign$ $fa$;'; 

SET @sql = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    '$c$', RTRIM(@CategoryID)), 
    '$o$', RTRIM(@OwnerID)), 
    '$ca$', RTRIM(@CurrentAmount)), 
    '$sign$', CASE @CompareSign WHEN 1 THEN '>' WHEN 2 THEN '<' WHEN 3 THEN '=' END), 
    '$fa$', RTRIM(@FilterAmount)); 

PRINT @sql; 
--EXEC sp_executesql @sql; 
0

如果你正在寫一個存儲過程由GavinCattell給出的解決方案似乎是工作,但我認爲,你是在case語句中不使用任何列,那麼你爲什麼要在查詢內部進行這種計算。你可以爲此使用if-else語句。 在查詢內部執行此操作會在很大程度上減慢查詢速度,並且使用if語句會快得多。