晚上好,
我有以下sql代码,需要替换子查询中的空值。从代码中可以看出,我尝试过使用ISNULL函数,并在其中使用了= NULL。
有人能帮忙吗?
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发布于 2014-01-24 00:01:12
试试这个:
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检查,输出都是空的。
发布于 2014-01-23 23:55:52
子查询中的where子句拒绝所有行,但列DISABILITY_TYPE_CD为'$HEAR'的行除外。因此,case语句将始终采用else路由,因为该列永远不会是null或空('')。
你到底想做什么?
您的查询最好写为
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”。
如果,正如我所怀疑的那样,您要做的是确定学生是否有听力障碍(或某些特定类型的残疾),您需要总结的内容。这样的查询可能会给您带来如下结果:
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发布于 2014-01-23 23:23:36
您不应该需要子查询(假设您的子查询只返回一条记录):
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'https://stackoverflow.com/questions/21321294
复制相似问题