我有一个名为Measures
的表,它根据PracticeID在不同字段中包含代码的结果值。例如:
PracticeID Code Value1 Value2
---------- ---- ------ ------
1 CX H null
2 CX null L
因此,对于PracticeID=1,结果在字段Value1中,对于PraticeID=2,结果在相同代码的字段Value2中。
如果我创建了一个翻译表Measure_Translate
,它存储了哪个字段将用于特定实践ID中的特定代码。例如:
PracticeID Code ColumnName
---------- ---- ----------
1 CX Value1
2 CX Value2
有没有任何方法可以使用Measure_Translate表来动态确定需要使用哪个字段来返回度量值(在本例中为CX(?
例如:
select m.PracticeID, m.Code,
--then dynamically get which Value field based on what is in the ColumnName
--field in Measure_Translate
from Measure as m
join Measure_Translate as t on t.PracticeID = m.PracticeID and t.Code = m.Code
如果你不能动态地更改实际的tsql,有人知道有什么解决办法吗?
提前感谢
不确定示例数据有多人工,但对于这种特定的数据,不需要转换表。函数可以返回不同于null
的第一个值。
样本数据
create table Measures
(
PracticeId int,
Code nvarchar(2),
Value1 nvarchar(1),
Value2 nvarchar(1)
);
insert into Measures (PracticeId, Code, Value1, Value2) values
(1,'CX','H',Null),
(2,'CX',Null,'L');
解决方案
select m.PracticeId,
m.Code,
coalesce(m.Value1, m.Value2) as Value
from Measures m;
结果
PracticeId Code Value
---------- ---- -----
1 CX H
2 CX L
Fiddle
如果样本数据过于简单化,并且您确实需要转换,那么您可以使用case表达式。
样本数据扩展
insert into Measures (PracticeId, Code, Value1, Value2) values
(3,'CX','H','L');
create table Measure_Translations
(
PracticeId int,
Code nvarchar(2),
ColName nvarchar(20)
);
insert into Measure_Translations (PracticeId, Code, ColName) values
(1,'CX','Value1'),
(2,'CX','Value2'),
(3,'CX','Value2');
解决方案
包含coalesce()
和case
方法以突出显示差异。
select m.PracticeId,
m.Code,
coalesce(m.Value1, m.Value2) as Value_coalesce,
case mt.ColName
when 'Value1' then m.Value1
when 'Value2' then m.Value2
end as Value_translation
from Measures m
join Measure_Translations mt
on mt.PracticeId = m.PracticeId
and mt.Code = m.Code;
结果
PracticeId Code Value_coalesce Value_translation
---------- ---- -------------- -----------------
1 CX H H
2 CX L L
3 CX H L --> difference
扩展小提琴