我需要在CASE WHEN语句中使用相关子查询。问题是在某些情况下相关子查询可能返回NULL。我将相关子查询与另一列结合在一起,因为子查询返回NULL,所以我在“结果”列中收到了null。
这里是例子:
create table ##sygnatura (ID int, syg_numer varchar(50))
create table ##sprawa (ID int, sp_numer varchar(50))
create table ##dluznik (ID int, nazwa varchar(max))
insert into ##sygnatura
select null,null
insert into ##sprawa
select 1,'abc'
insert into ##dluznik
select 1,'XYZ'
select sp_numer,
case when nazwa='XYZ' then (select isnull(syg_numer,'') from ##sygnatura where ##sygnatura.ID=##sprawa.ID)+', '+isnull(nazwa, '') end as result
From ##sprawa
join ##dluznik on ##sprawa.ID=##dluznik.ID
答案 0 :(得分:3)
您需要移动ISNULL来封装子查询,因为由于子查询未返回任何行而导致得到NULL结果:
select sp_numer,
case when nazwa='XYZ' then ISNULL((select isnull(syg_numer,'') from ##sygnatura where ##sygnatura.ID=##sprawa.ID) + ', ','') + isnull(nazwa, '') end as result
From ##sprawa
join ##dluznik on ##sprawa.ID=##dluznik.ID
答案 1 :(得分:0)
下面是一种方法,但是比使用EXISTS
select sp_numer,
case when nazwa='XYZ'
and exists (select 1 from ##sygnatura where ##sygnatura.ID=##sprawa.ID)
then (select isnull(syg_numer,'') from ##sygnatura where ##sygnatura.ID=##sprawa.ID)+', '+isnull(nazwa, '')
else isnull(nazwa, '')
end as result
From ##sprawa
join ##dluznik on ##sprawa.ID=##dluznik.ID
答案 2 :(得分:0)
我认为您可以使用另一个JOIN
这样轻松地获得预期结果:
select sp_numer,
case when nazwa='XYZ' then isnull(syg_numer + ', ', '') + isnull(nazwa, '') end as result
From ##sprawa
join ##dluznik on ##sprawa.ID=##dluznik.ID
left join ##sygnatura on ##sprawa.ID=##sygnatura.ID