Sql server 2008 在SQL Server WHERE子句中使用CASE语句
我试图根据每个州或城市的人口数量来更改Sql server 2008 在SQL Server WHERE子句中使用CASE语句,sql-server-2008,Sql Server 2008,我试图根据每个州或城市的人口数量来更改WHERE子句 如果一个州有超过10人,我希望的位置是: WHERE u.StateID = @StateID 如果一个城市的人口超过10人,我希望是: WHERE u.CityID = @CityID WHERE u.CountryID = '1' ALTER PROCEDURE GetHighscore (@UserID int) AS BEGIN Declare @StateCount int Declare @CityCount int
WHERE
子句
如果一个州有超过10人,我希望的位置是:
WHERE u.StateID = @StateID
如果一个城市的人口超过10人,我希望是:
WHERE u.CityID = @CityID
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
而不是
WHERE u.StateID = @StateID
如果城市或州的人口不超过10人,我希望是:
WHERE u.CityID = @CityID
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
必须使用和/或运算符和嵌套条件,而不是大小写
(@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')
(@StateCount>10和u.StateID=@StateID)
或
(@CityCount>10和@StateCount这听起来真是个糟糕的主意-你必须找出人数(这是英语中“person”的正确复数)首先在一个城市或州,在您决定如何动态构建SQL语句之前……好的,我将试着记住Marc。每个城市或州的人口数量可以从StateCount和CityCount中获得。好的,但是即使一个城市有50人,我也不会得到该城市的高分,因为有or(CountryID='1')每个人都有countryID 1。正因为如此,我让每个人都在高分,而不仅仅是城市。更新答案。这是完整的指定标准。它可以通过使用嵌套条件进行优化。