SQL查询CASE语句

时间:2017-04-21 18:54:35

标签: sql-server

我有两个表一个是主表,另一个表是你可以从第一个表中选择项目。

MasterTable

ItemID      ItemName
1           Football
2           Cricket
3           Badminton 

SelectionTable

UserID     SelectedItemId
1            2
1            3
2            1

输出

UserId      SelectedItemID     SelectionStatus
1            1                   False
1            2                   True
1            3                   True

查询

SELECT  S.UserId,M.ItemID,
        CASE M.ItemID 
            WHEN 1 Then 'True'
            WHEN 2 Then 'True'
            WHen 3 Then 'True' END AS SelectionStatus
From MasterTable M
JOIN SelectionTable S ON S.SelectedItemID=M.ItemID      
WHERE S.UserId=1

如果没有选择任何项目,那么所有项目都是假的。我不知道该怎么做。

2 个答案:

答案 0 :(得分:1)

假设您有一个User表,您可以通过查询cartesean产品(交叉连接)来获取每个用户/项目组合的状态。

状态TrueFalse可以确定SelectionTable中是否存在相应记录。

select
    u.UserId,
    m.ItemId,
    case
        when exists
            (select *
            from SelectionTable s
            where s.UserId = u.UserId
              and s.SelectedItemId = m.ItemId)
        then 'True'
        else 'False'
    end
from MasterTable m, User u

此技术可应用于单个用户案例(UserId等于1),如下所示:

select
    m.ItemId,
    case
        when exists
            (select *
            from SelectionTable s
            where s.UserId = 1
              and s.SelectedItemId = m.ItemId)
        then 'True'
        else 'False'
    end
from MasterTable m

答案 1 :(得分:0)

您可以else使用left joinSelectionTable MasterTable

SELECT  S.UserId,M.ItemID,
        CASE M.ItemID 
            WHEN 1 Then 'True'
            WHEN 2 Then 'True'
            WHen 3 Then 'True' 
            else 'False'
            END AS SelectionStatus
From SelectionTable S
  left JOIN MasterTable M ON S.SelectedItemID=M.ItemID      
WHERE S.UserId=1