2016-08-14 108 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