在我的软件系统中,一个重要的查阅列历史上有三个数值之一。
我们现在要允许更多的值,但我仍然需要能够在原始的三点范围内映射所有中间值。
系统用于根据整数值评定正,中性和负值。它用于2,4和6
我们现在已经进入-5到+5评级系统,但仍然只使用2,4和6来传递正中性和负值。
在数据库中,我们编写了一个sproc,返回的行只有2或4或6,但现在它需要返回行 -5到-2,如果它是6。 -1到1,如果4。 和-2到-5,如果2。
这就是编写内部联接的方式
INNER JOIN @SiteIDs sti ON sti.SiteID = s.SiteID
--AND d.SiteID IN (ISNULL(@SiteIDList, d.SiteID))
AND ISNULL(s.DatePosted, '1/1/1901') >= ISNULL(@StartDate, '1/1/1900')
AND ISNULL(s.DatePosted, '1/1/9998') <= ISNULL(@EndDate, '1/1/9999')
AND s.Favorite = CASE WHEN @FavoritesOnly = 1 THEN 1 ELSE s.Favorite END
AND s.SID = ISNULL(@SID, s.SID) -- this is what needs to be changed
我知道需要发生什么:
当@SID为6时,s.sid需要返回-2,-3,-4和-5的所有值,对于其他两个范围也是如此。
我只是不确定如何正确地对它进行语法化。
答案 0 :(得分:0)
这是你想要的吗?
AND @SID is null or @SID = 6 and SID in (-2, -3, -4, -5)
答案 1 :(得分:0)
如果你有这样的事情:
SELECT rating -- this used to return 2, 4, or 6
...
现在需要
SELECT CASE WHEN rating = 6 THEN -1
WHEN rating = 4 THEN -2
WHEN rating = 2 THEN -5
ELSE 0 -- this is an error
END AS rating
...
如果您只想在@SID = 6时执行此操作,那么
SELECT CASE WHEN @SID = 6 AND rating = 6 THEN -1
WHEN @SID = 6 AND rating = 4 THEN -2
WHEN @SID = 6 AND rating = 2 THEN -5
ELSE rating
END AS rating
...
答案 2 :(得分:0)
我认为这就是你所追求的:
INNER JOIN @SiteIDs sti ON sti.SiteID = s.SiteID
--AND d.SiteID IN (ISNULL(@SiteIDList, d.SiteID))
AND ISNULL(s.DatePosted, '1/1/1901') >= ISNULL(@StartDate, '1/1/1900')
AND ISNULL(s.DatePosted, '1/1/9998') <= ISNULL(@EndDate, '1/1/9999')
AND s.Favorite = CASE WHEN @FavoritesOnly = 1 THEN 1 ELSE s.Favorite END
AND s.SID between
case coalesce(@SID,0)
when 6 then -5
when 4 then -1
when 2 then 2
default s.SID --if @SID is not valid, all results are returned
end
and
case coalesce(@SID,0)
when 6 then -2
when 4 then 1
when 2 then 5
default s.SID
end