如何使单个连接值与一系列值匹配

时间:2014-07-12 01:39:06

标签: sql inner-join

在我的软件系统中,一个重要的查阅列历史上有三个数值之一。

我们现在要允许更多的值,但我仍然需要能够在原始的三点范围内映射所有中间值。

系统用于根据整数值评定正,中性和负值。它用于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的所有值,对于其他两个范围也是如此。 我只是不确定如何正确地对它进行语法化。

3 个答案:

答案 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