使用字段值(ID)从参考表获取TEXT值

时间:2019-07-12 17:43:01

标签: sql join sql-server-2012

我有一个要解决的表有些奇怪的情况。我有一张看起来像这样的桌子:

 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

1 个答案:

答案 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';
相关问题