2016-08-14 3 views
1

У меня есть таблица с данными, как показано ниже,Попытка использовать саз в 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 и идентификатор региона из доступных regionname и regionid, где Defaultflag = 1.

Любая помощь будет оценена по достоинству.

+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

Смежные вопросы