带有CASE语句的SQL LEFT JOIN

时间:2013-10-11 15:20:10

标签: sql sql-server-2005

我正在使用SQL Server 2005并尝试以一种我似乎无法工作的方式构建查询。

我有两张桌子。一个表具有ItemTypes列表,另一个表具有ItemTypes和用户之间的映射列表。

我希望有一个返回这些结果的查询:

ID   | ItemType      | Enabled?
---------------------------------
1    | Type1         | false
2    | Type2         | true

Enabled列将基于另一个表中是否有条目。我想使用某种case语句,如果LEFT JOIN项存在,则输入TRUE,否则输入FALSE。

SELECT systype.ID, systype.TypeDescription, 
'Enable' = CASE hid.ID WHEN NULL THEN 'true' ELSE 'false' END
FROM [HardwareTestcaseManagement].[dbo].[A7_SystemItemTypes] systype
LEFT JOIN [dbo].[A7_HiddenNewsFeedTypes] hid 
ON systype.ID = hid.SystemItemTypesID
AND hid.UserName = @UserName

但是,到目前为止我提出的这个查询^并没有像我预期的那样工作。

有什么建议我可以调整这个查询来实现我想要的工作吗?

编辑:当我执行左连接并且只选择列“hid.ID”时,它将返回NULL或实际ID。我希望我可以根据它是否为空来修改该值。

6 个答案:

答案 0 :(得分:3)

一种简单有效的方法是使用EXISTS代替联接:

SELECT systype.ID, systype.TypeDescription, 
       [Enable] = CASE WHEN EXISTS( 
                     SELECT 1 FROM A7_HiddenNewsFeedTypes ft
                     WHERE ft.SystemItemTypesID = systype.ID
                     AND ft.UserName = @UserName
                  ) THEN 'true' ELSE 'false' END
FROM [HardwareTestcaseManagement].[dbo].[A7_SystemItemTypes] systype

答案 1 :(得分:2)

CASE有两种格式。检查Searched Case值时,您需要使用Simple Case NOT null;

SELECT systype.ID, systype.TypeDescription, 
      CASE WHEN hid.UserName IS NULL THEN 'false' ELSE 'true' END Enabled
FROM [HardwareTestcaseManagement].[dbo].[A7_SystemItemTypes] systype
LEFT JOIN [dbo].[A7_HiddenNewsFeedTypes] hid 
         ON systype.ID = hid.SystemItemTypesID
         AND hid.UserName = @UserName

答案 2 :(得分:2)

您无法将null值与其他值进行比较。使用is null中的case运算符:

'Enable' = CASE WHEN hid.ID IS NULL THEN 'true' ELSE 'false' END

答案 3 :(得分:1)

SELECT systype.ID, systype.TypeDescription, 
CASE WHEN hid.SystemItemTypesID IS NULL THEN 'true' ELSE 'false' END as Enable
FROM [HardwareTestcaseManagement].[dbo].[A7_SystemItemTypes] systype
LEFT JOIN [dbo].[A7_HiddenNewsFeedTypes] hid 
ON systype.ID = hid.SystemItemTypesID
AND hid.UserName = @UserName

答案 4 :(得分:0)

SELECT DISTINCT systype.ID, systype.TypeDescription, 
'Enable' = CASE
     WHEN hid.UserName = @UserName THEN 'true'
     ELSE 'false'
   END
FROM [HardwareTestcaseManagement].[dbo].[A7_SystemItemTypes] systype
LEFT JOIN [dbo].[A7_HiddenNewsFeedTypes] hid 
ON systype.ID = hid.SystemItemTypesID
-- no join on UserName

答案 5 :(得分:0)

另一种方法是不使用CASE

'Enable' = isnull(nullif(isnull(hid.id,'false'),hid.id),'true')
相关问题