2012-04-13 24 views
0

各州または市に存在する人の数に応じてWHERE節を変更しようとしています。SQL ServerのWHERE句でCASE文を使用する

私はWHEREになりたい状態でもっとして10人がある場合:

WHERE u.CityID = @CityID 
:私はそれになりたい都市でもっとして10人がいる場合

WHERE u.StateID = @StateID 

は、

代わりの

WHERE u.StateID = @StateID 

10人、より多くの都道府県や市町村のいずれかに存在していない場合、私はそれになりたいです:

WHERE u.CountryID = '1' 



ALTER PROCEDURE GetHighscore 
(@UserID int) 
AS 
BEGIN 
Declare @StateCount int 
Declare @CityCount int 
Declare @StateID int 
Declare @CityID int 

SELECT @StateID=StateID FROM tblUser WHERE UserID = @UserID 

SELECT @CityID=CityID FROM tblUser WHERE UserID = @UserID 

SELECT @StateCount=COUNT(DISTINCT tblUserTrix.UserID) 
FROM   tblUserTrix INNER JOIN 
         tblUser ON tblUserTrix.UserID = tblUser.UserID 
WHERE  (tblUser.StateID = @StateID) 

SELECT @CityCount=COUNT(DISTINCT tblUserTrix.UserID) 
FROM   tblUserTrix INNER JOIN 
         tblUser ON tblUserTrix.UserID = tblUser.UserID 
WHERE  (tblUser.CityID = @CityID) 


SELECT TOP 10  ut.UserID, SUM(t.Hardness) AS TotalTrixPoints, u.FirstName, u.LastName, u.StateID, u.CityID, tblSweCitys.CityName 
FROM   tblUserTrix AS ut INNER JOIN 
         tblUser AS u ON ut.UserID = u.UserID INNER JOIN 
         tblState ON u.StateID = tblState.StateID INNER JOIN 
         tblCitys ON u.CityID = tblCitys.CityID LEFT OUTER JOIN 
         tblTrix AS t ON ut.TrixID = t.TrixID 

WHERE CASE 
WHEN @StateCount > 10 
THEN u.StateID = @StateID 

WHEN @CityCount > 10 
THEN u.CityID = @CityID 
ELSE u.CountryID = '1' 
     END = ? 

GROUP BY ut.UserID, u.FirstName, u.LastName, u.CityID, u.StateID, tblCitys.CityName 
ORDER BY TotalTrixPoints DESC 

END 
+0

これは本当に悪いアイデアのように聞こえる - あなたは**人の数を見つけるしなければなりませんあなたのSQLステートメントを動的に構築する方法を決定する前に、都市または州で最初に**(これは英語の適切な複数の「人」の複数のものです)...... –

+0

オーク、私はそのマークを覚えようとします。各都市または州の人数は、StateCountとCityCountから取得します。 – user1007103

答えて

2

CASEではなくAND/OR演算子と入れ子条件を使用する必要があります。

(@StateCount > 10 AND u.StateID = @StateID) OR (@CityCount > 10 AND CityID = @CityID) OR (CountryID = '1') 

このようなものもあります。

UPDADE

ので、本当にこの例ではあなたのために正常に動作していませんでした。より複雑なwhere節が必要です。

(@StateCount > 10 AND u.StateID = @StateID) 
OR 
(@CityCount > 10 AND @StateCount <= 10 AND CityID = @CityID) 
OR 
(@StateCount <= 10 AND @CityCount <= 10 AND CountryID = '1') 

UPDATE 2

そして、これは少し良く::これを試してみてください

(@StateCount > 10 AND u.StateID = @StateID) 
OR 
(@StateCount <= 10 
    AND 
    (
     (@CityCount > 10 AND CityID = @CityID) 
     OR 
     (@CityCount <= 10 AND CountryID = '1') 
    ) 
) 
+0

オハイオ州、しかし、50人が市にいる場合でも、OR(CountryID = '1')があるので、市の最高得点を得ることはできません。誰もがcountryID 1を持っています。そしてそのために、街だけではありません。 – user1007103

+0

答えが更新されました。これは完全指定の基準です。ネストされた条件を使用して最適化することができます。 –

+0

素晴らしい!どうもありがとう! – user1007103