1

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

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

我想要一个返回这些结果的查询:

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

启用列将基于另一个表中是否有条目。我想使用某种 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 的形式返回。我希望我可以根据它是否为空来修改该值。

4

6 回答 6

3

A simple and efficient approach is to use EXISTS instead of a join:

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
于 2013-10-11T15:29:07.610 回答
2

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

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
于 2013-10-11T15:24:36.787 回答
2

您不能null像其他值一样比较值。在:中使用is null运算符case

'Enable' = CASE WHEN hid.ID IS NULL THEN 'true' ELSE 'false' END
于 2013-10-11T15:24:54.903 回答
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
于 2013-10-11T15:29:51.337 回答
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
于 2013-10-11T15:24:35.857 回答
0

只是另一种不使用的方式CASE

'Enable' = isnull(nullif(isnull(hid.id,'false'),hid.id),'true')
于 2013-10-11T17:09:40.673 回答