首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有IS NULL的Case语句不按要求执行。

带有IS NULL的Case语句不按要求执行。
EN

Stack Overflow用户
提问于 2014-01-23 23:12:46
回答 3查看 302关注 0票数 0

晚上好,

我有以下sql代码,需要替换子查询中的空值。从代码中可以看出,我尝试过使用ISNULL函数,并在其中使用了= NULL。

有人能帮忙吗?

代码语言:javascript
复制
Select Student_Details.STU_ID ,
       ( Select case ISNULL( s1stu_disability_type.DISABILITY_TYPE_CD , '' )
           when '' then 'NO'
           else 'YES'
         end
         from s1stu_disability_type
         Where Student_Details.STU_ID = s1stu_disability_type.STU_ID 
           and DISABILITY_TYPE_CD = '$HEAR'
       ) as 'Hearing Disability'
from S1STU_DET as Student_Details
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-24 00:01:12

试试这个:

代码语言:javascript
复制
Select Student_Details.STU_ID ,
       IsNull(( Select case ISNULL( s1stu_disability_type.DISABILITY_TYPE_CD , '' )
           when '' then 'NO'
           else 'YES'
         end
         from s1stu_disability_type
         Where Student_Details.STU_ID = s1stu_disability_type.STU_ID 
           and DISABILITY_TYPE_CD = '$HEAR'
       ), 'No') as 'Hearing Disability'
from S1STU_DET as Student_Details

基本上,ISNULL函数必须位于子查询之外,才能按您希望的方式工作。可以这样想,如果子查询不返回任何行,那么无论您在子查询中是否有isnull检查,输出都是空的。

票数 0
EN

Stack Overflow用户

发布于 2014-01-23 23:55:52

子查询中的where子句拒绝所有行,但列DISABILITY_TYPE_CD'$HEAR'的行除外。因此,case语句将始终采用else路由,因为该列永远不会是null或空('')。

你到底想做什么?

您的查询最好写为

代码语言:javascript
复制
select sd.STU_ID ,
       dt.DISABILITY_TYPE_CD
from S1STU_DET             sd
join s1stu_disability_type dt on dt.STU_ID = sd.STU_D
                              and dt.DISABILITY_TYPE_CD = '$HEAR'

它几乎可以证明学生和学生之间的关系是零对多的基数,也就是说每个学生都有零或更多的残疾。

因此,原始查询及其相关子查询将返回每个学生1行,但根据SQL标准,对于子查询选择哪一个匹配的残疾,这是抽签的运气。

我上面的查询将为每个有匹配残疾的学生返回一行。不包括无相应残疾的学生。要将其更改为包含所有学生,您需要将[inner] join更改为left [outer] join。然后,每个学生至少会在结果集中被代表一次。如果学生没有匹配的残疾,则学生残障表的所有列都将为“null”。

如果,正如我所怀疑的那样,您要做的是确定学生是否有听力障碍(或某些特定类型的残疾),您需要总结的内容。这样的查询可能会给您带来如下结果:

代码语言:javascript
复制
select sd.STU_ID ,
       case sign(coalesce(hd.cnt,0))
       when 1 then 'YES'
       else        'NO'
       end as HAS_HEARING_DISABILITY
from S1STU_DET sd
left join ( select STU_ID ,
                   count(*) as cnt
            from s1stu_disability
            where DISABILITY_TYPE_CD = '$HEAR'
            group by STU_ID
          ) hd on hd.STU_ID = sd.STU_ID
票数 1
EN

Stack Overflow用户

发布于 2014-01-23 23:23:36

您不应该需要子查询(假设您的子查询只返回一条记录):

代码语言:javascript
复制
Select 
    Student_Details.STU_ID,
    case WHEN Student_Disability.DISABILITY_TYPE_CD IS NULL
      THEN 'NO'
      ELSE 'YES'
      END
      as 'Hearing Disability'
 from S1STU_DET as Student_Details
 LEFT JOIN s1stu_disability_type Student_Disability
    ON Student_Details.STU_ID = Student_Disability.STU_ID
    and Student_Disability.DISABILITY_TYPE_CD = '$HEAR'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21321294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档