从嵌套在case语句中的子查询返回单个值

时间:2014-01-23 19:15:52

标签: sql subquery case

我有一个存储信息的存档表。存储的值之一是我可以将其与另一个表中的区域名称关联起来的ID。此ID的值可以是0或大于0.如果值为0则不可用,我只是希望它显示空字符串(NULL也可以),如果ID大于0,我想将ID替换为与其相关的区域名称。注意:我不能直接将ID关联到Districts表,因为它返回多个重复记录(因此Top(1))。

这实际上是否可行,如果不是,还有另一种方法吗?

SELECT TeacherID, StartTime, EndTime,

   (Case TeacherScheduleArchice.TeacherStudent_ServiceTypeID

   When 0 THEN ''

   Else 

   SELECT Top(1) DistrictName From Districts Where District.TeacherStudent_ServiceTypeID =  TeacherScheduleArchice.TeacherStudent_ServiceTypeID

   END) As District

   FROM         TeacherScheduleArchive

2 个答案:

答案 0 :(得分:0)

这应该是可能的,您只需将括号放在子选项周围 - 并且可以将它们留在CASE周围:

SELECT TeacherID, StartTime, EndTime,
   Case TeacherScheduleArchice.TeacherStudent_ServiceTypeID
   When 0 THEN ''
   Else 
   (SELECT Top(1) DistrictName
      From Districts
     Where District.TeacherStudent_ServiceTypeID = TeacherScheduleArchice.TeacherStudent_ServiceTypeID
   )
   END As District
   FROM         TeacherScheduleArchive

但是,我会使用DISTINCT代替Top(1),因为如果只有一个,则会返回单个值,只重复几次。但是,如果同一TeacherStudent_ServiceTypeID存在不同的值,则会导致错误。这会警告你,而不是返回任意条目。

答案 1 :(得分:0)

您只需要一组额外的括号:

SELECT TeacherID, StartTime, EndTime,
       (Case TeacherScheduleArchice.TeacherStudent_ServiceTypeID
            When 0 THEN ''
            Else (SELECT Top(1) DistrictName
                  From Districts
                  Where District.TeacherStudent_ServiceTypeID =  TeacherScheduleArchice.TeacherStudent_ServiceTypeID
                 )
       END) As District
FROM  TeacherScheduleArchive;