2012-04-13 2 views
0

Я пытаюсь изменить предложение WHERE в зависимости от того, сколько людей существует в каждом штате или городе.Использование оператора CASE в SQL Server Предложение WHERE

Если есть более 10 людей в состоянии Я хочу WHERE быть:

WHERE u.StateID = @StateID 

Если есть более 10 людей в городе, я хочу, чтобы это было:

WHERE u.CityID = @CityID 

вместо

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

okey, я постараюсь запомнить этот Марк. Количество людей в каждом городе или штате я получаю от StateCount и CityCount. – user1007103

ответ

2

Вы должны использовать операторы AND/OR и вложенные условия вместо CASE.

(@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

okey, но даже если в городе 50 человек, я не получаю рекорды для города, потому что есть OR (CountryID = '1'). У каждого есть countryID 1. И из-за этого я получаю всех в рекорде, не только город. – user1007103

+0

Обновленный ответ. Это полностью определенные критерии, как есть. Его можно оптимизировать, используя вложенные условия. –

+0

Отлично! Большое спасибо! – user1007103

Смежные вопросы