我有一个要解决的表有些奇怪的情况。我有一张看起来像这样的桌子:
ID FldVal OldVal NewVal
1 Name Bob Robert
2 Cost 17 21
3 Location 32 NULL
OldVal和NewVal是Varchar(MAX)字段,并存储由用户更新的所有字段值。其中99%是简单的文本或数字值,其中一些(例如LOCATION)实际上是Reftable中的ID值,如下所示:
ID Code Text
1 31 Office
2 32 Park
3 17 Opera
我的问题是,有什么方法可以将第一个表与Ref表连接起来,以便它仅提取特定值。由于我可能有各种各样的值,例如17、21,所以我不希望它们偶然从Ref表中提取TEXT值。我只希望它在“位置”上执行该操作。
我的目标是获得这些结果
Name Bob Robert
Cost 17 21
Location Park NULL
答案 0 :(得分:1)
我认为您想要这样的东西:
select t.*,
(case when f.fldval = 'Location' then ro.text then t.oldval end) as new_oldval,
(case when f.fldval = 'Location' then rn.text else t.newval end) as new_newval
from t left join
reftable ro
on ro.code = try_convert(int, t.oldval) and
t.fldval = 'Location' left join
reftable rn
on rn.code = try_convert(int, t.newval) and
t.fldval = 'Location';
为了向后兼容,可以将其转换为字符串而不是整数:
select t.*,
(case when f.fldval = 'Location' then ro.text then t.oldval end) as new_oldval,
(case when f.fldval = 'Location' then rn.text else t.newval end) as new_newval
from t left join
reftable ro
on convert(varchar(255), ro.code) = t.oldval and
t.fldval = 'Location' left join
reftable rn
on convert(varchar(255), rn.code) = t.newval and
t.fldval = 'Location';