2016-08-14 4 views
1

Ich habe Tabelle mit den Daten zu verwenden, wie unten gezeigt,Versuch CASE-Anweisung in 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') 

ich das Ergebnis will gesetzt, wie, wenn region/regionId null, dann sollte es die die region und Region id holen aus verfügbarem Regionsnamen und Regions-ID, wobei Defaultflag = 1 ist.

Jede Hilfe wird geschätzt.

+0

Abgesehen: Mit einem 'Char (1)' speichern ein 'Bit' Wert eine schöne Art und Weise liefert Daten speichern Sie dies nicht tun wollen, z 'j'. Wenn Sie nicht erwarten, zusätzliche Werte zu benötigen, sollten Sie sie nicht zulassen. – HABO

Antwort

0

Sie scheinen eine sehr schlechte Datenstruktur zu haben. Warum werden die Standardeinstellungen bei den Benutzern gespeichert?

In jedem Fall könnte dies tun, was Sie wollen:

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; 

Dies setzt voraus, dass nur eine Zeile die Standard-Flag gesetzt hat.

Ich sollte anmerken, dass Sie dies ohne Unterabfrage tun können:

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

Danke Gordon. Nur eine Zeile hat das Standard-Flag. – Krisha