我正在使用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。我希望我可以根据它是否为空来修改该值。
答案 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')