2016-08-14 106 views
1

我有一个数据表,如下图所示,尝试使用CASE语句在SQL Server

create table #UserRegion 
(
    UserName varchar(25), 
    RegionName varchar(25), 
    RegionID varchar(10), 
    RegionStatus varchar(15), 
    DefaultFlag char(1) 
) 

Insert into #UserRegion 
values ('UserOne', 'Chicago', 'MW-1', 'Oniline', '1'), 
     ('UserTwo', 'SanJose', 'W-6', 'Oniline', '0'), 
     ('UserThree', NULL, NULL, 'Oniline', NULL), 
     ('UserFour', NULL, NULL, 'Oniline', NULL), 
     ('UserFive', 'Miami', 'E-4', 'Oniline', '0') 

我想要的结果集,如果regionname/regionid空,那么它应该在挑选regionname和区域ID从Defaultflag = 1的可用regionname和regionid。

任何帮助将不胜感激。

+0

旁白:使用'CHAR(1)'来存储'Bit'值提供了一个很好的方式来存储数据,你不想要,例如'j'。如果你不期望需要额外的价值,那么你不应该允许他们。 – HABO

回答

0

您似乎有一个非常差的数据结构。为什么与用户一起存储默认值?

在任何情况下,这可能会做你想要什么:

select ur.*, 
     coalesce(ur.regionname, urdefault.regionname) as regionname, 
     coalesce(ur.regionid, urdefault.regionid) as regionid 
from #UserRegion ur cross join 
    (select ur.* 
     from #UserRegion ur 
     where DefaultFlag = '1' 
    ) urdefault; 

这假定只有一行具有默认标志设置。

我要指出,你可以做到这一点没有一个子查询:

select ur.*, 
     coalesce(ur.regionname, 
       max(case when DefaultFlag = '1' then regionname end) over() 
       ) as regionname, 
     coalesce(ur.regionid, 
       max(case when DefaultFlag = '1' then regionid end) over() 
       ) as regionid 
from #UserRegion ur; 
+0

谢谢戈登。只有一行将具有默认标志。 – Krisha