Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL使用CASE语句左连接_Sql_Sql Server 2005 - Fatal编程技术网

SQL使用CASE语句左连接

SQL使用CASE语句左连接,sql,sql-server-2005,Sql,Sql Server 2005,我正在使用SQLServer2005,并试图以一种似乎无法正常工作的方式构建查询 我有两张桌子。一个表具有ItemType列表,另一个表具有ItemType和用户之间的映射列表 我想要一个将返回以下结果的查询: ID | ItemType | Enabled? --------------------------------- 1 | Type1 | false 2 | Type2 | true 启用列将基于另一个表中是否有条目。我想使

我正在使用SQLServer2005,并试图以一种似乎无法正常工作的方式构建查询

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

我想要一个将返回以下结果的查询:

ID   | ItemType      | Enabled?
---------------------------------
1    | Type1         | false
2    | Type2         | true
启用列将基于另一个表中是否有条目。我想使用某种case语句,如果左连接项存在,则将其置为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。我希望可以根据值是否为NULL来修改该值。

有两种格式。检查
null
值时,需要使用
Searched Case
而不是
Simple Case

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
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
有两种格式。检查
null
值时,需要使用
Searched Case
而不是
Simple Case

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

不能将
null
值与其他值进行比较。在
案例中使用
is null
运算符:

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

不能将
null
值与其他值进行比较。在
案例中使用
is null
运算符:

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

一种简单有效的方法是使用
EXISTS
而不是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

一种简单有效的方法是使用
EXISTS
而不是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

这只是另一种不使用
CASE

'Enable' = isnull(nullif(isnull(hid.id,'false'),hid.id),'true')

这只是另一种不使用
CASE

'Enable' = isnull(nullif(isnull(hid.id,'false'),hid.id),'true')


如果有很多用户,将扫描许多行,因为用户名上的连接被删除(这就是为什么添加了distinct)。如果有很多用户,将扫描许多行,因为用户名上的连接被删除(这就是为什么添加了distinct)@Nenad实际上这是一个外部表,所以很可能存在为NULL的情况。(从技术上讲,这不是WHERE子句,而是连接标准。)@AaronBertrand。。我的错,我不知道怎么做,但我想我已经看到了
WHERE
关键字。另外,请使用
[方括号]
而不是
“单引号”
作为列别名。后者在多种形式中被弃用,使您的别名看起来像字符串。或者更好的是,不要使用关键字,或者无论如何也不要费心去逃避它——这是没有必要的<代码>选择启用=1
工作正常,除了由于IntelliSense,
Enable
在SSMS中显示为蓝色外。@Nenad实际上这是一个外部表,因此很可能存在它为空的情况。(从技术上讲,这不是WHERE子句,而是连接标准。)@AaronBertrand。。我的错,我不知道怎么做,但我想我已经看到了
WHERE
关键字。另外,请使用
[方括号]
而不是
“单引号”
作为列别名。后者在多种形式中被弃用,使您的别名看起来像字符串。或者更好的是,不要使用关键字,或者无论如何也不要费心去逃避它——这是没有必要的<代码>选择启用=1
工作正常,除了由于IntelliSense,
启用
在SSMS中以蓝色显示。我想,这永远不会返回false,因为hid.UserName=@UserName的位置为什么要将hid.UserName加入条件更改为筛选器?您刚刚将其从左连接更改为内部连接。啊,很抱歉,这是一个错误,我正在关注大小写,谢谢您指出。我想,这永远不会返回false,因为hid.UserName=@UserName为什么要将hid.UserName连接条件更改为筛选器?您刚刚将此从左连接更改为内部连接。啊,抱歉,这是一个错误,我正在集中精力处理案例,谢谢您指出。这正是我要找的。我刚才对案件陈述的措辞不恰当。工作得很好。谢谢,正是我想要的。我刚才对案件陈述的措辞不恰当。工作得很好。谢谢。还需要一些外部查询,还是不需要?@vasja为什么?A7_SystemItemTypes表的原始查询中没有过滤器。好的,我现在看到(由于没有提供示例,我对表中的内容的错误猜测)仍然需要一些外部查询的WHERE,或者没有?@vasja为什么?A7_SystemItemTypes表的原始查询中没有过滤器。好的,我现在明白了(由于没有提供示例,我对表中的内容的猜测是错误的)