SQL:按列名选择值

时间:2019-06-30 13:05:26

标签: sql sql-server

我想从表中获取值,但是引用是目标表的列名而不是键-是的,设计不好。 老实说,我不知道从哪里开始。你能给我一些方向吗?

这就是我所拥有的

“来源”表

//   scaled X  - half scaled zoom factor * upscaled lense size
zx=pos.x*cx -(0.5*cx)* (lw/cx) ; 
zy=pos.y*cy -(0.5*cy)* (lh/cy) ;


// re evaluation the eq :
zx=pos.x*cx -(0.5*lw) ; 
zy=pos.y*cy -(0.5*lh) ; 

带表的表

ID | TargetField
---+-------------
 1 |   Field1   
 1 |   Field2   
 2 |   Field2   
 3 |   Field1   

结果将是这样:

ID | Field1 | Field2
---+--------+---------
 1 |   A    | B
 2 |   R    | C
 3 |   X    | D

如前所述,不知道如何开始...我在看一些动态SQL吗?

编辑:该示例已相当简化,因此开关/大小写对我不起作用。我想使用动态sql。

2 个答案:

答案 0 :(得分:1)

这是一种不需要动态SQL的方法。就是说,我怀疑动态SQL和/或UNPIVOT的性能会更高。

  • 交叉应用B会将记录转换为XML

  • 交叉应用C将使用B的XML并取消记录的记录

  • 然后在ID和Item上连接Source表是一件小事

示例dbFiddle

Select A.[ID]
      ,C.*
 From  YourTable A
 Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
 Cross Apply (
                Select Item  = xAttr.value('local-name(.)', 'varchar(100)')
                      ,Value = xAttr.value('.','varchar(max)')
                 From  XMLData.nodes('//@*') xNode(xAttr)
                 Where xAttr.value('local-name(.)','varchar(100)') not in ('Id','Other-Columns','To-Exclude')
             ) C
 Join Source D on A.ID=D.ID and C.Item=D.TargetField

返回

ID  Item    Value
1   Field1  A
1   Field2  B
2   Field2  C
3   Field1  X

答案 1 :(得分:0)

您可以使用case表达式:

select s.id,
       (case when s.targetfield = 'field1' then r.field1
             when s.targetfield = 'field2' then r.field2
        end)
from source s join
     referenced r
     on s.id = r.id;