簡體   English   中英

如何從表中的列中選擇一個值,動態使用其他表中的列名(反射)

[英]How to select a value from column in table, using column name from other table dynamically (reflection)

我試圖根據像這樣的另一個表中的列ID在具有多列的表中選擇一個值

foo:
+-------+--------+--------+--------+
|  id   |  tag   | col1   |  col2  |
+-------+--------+--------+--------+
|   1   |   XX   |    1   |    2   |
+-------+--------+--------+--------+
bar:
+-------+--------+--------+
| id    | field  |  tag   |
+-------+--------+--------+
|   1   |  col1  |   XX   |
+-------+--------+--------+
|   2   |  col2  |   XX   |
+-------+--------+--------+

我想我正在尋找的是一種類似反射的機制,在這種機制下,我可以基於該屬性的名稱映射到屬性值,而不必事先了解類或表,因為列可以隨時間變化,結果表應該看起來像這樣

foobar:
+--------+--------+
|  tag   | value  |
--------++--------+
|   XX   |    1   |
--------++--------+
|   XX   |    2   |
--------++--------+

我嘗試了類似以下代碼的方法,但是它在兩個結果列中都提供了列ID,因此我需要該特定字段的值而不是列名。

declare @SQL nvarchar(max)
declare @Pattern nvarchar(100)

set @Pattern = 'select bar.field, ''foo.[COL_NAME]'' as CurrentValue FROM bar INNER JOIN foo ON foo.[tag] = bar.[tag]'

select @SQL = stuff((select ' union all '+replace(@Pattern, '[COL_NAME]', field)
                 from bar
                 for xml path(''), type).value('.', 'nvarchar(max)'), 1, 11, '')

exec (@SQL)

不要以為用單個SQL語句動態地做到這一點。 但是您可以使用動態sql來實現。

對於給定的數據集,獲得期望結果的最簡單方法是使用case語句。

select foo.tag, 
case 
    when bar.field = 'col1' then foo.col1
    when bar.field = 'col2' then foo.col2
    else null
end as value
from foo
    inner join bar on foo.tag = bar.tag

只是when...then...零件是動態的,而其余部分是靜態的。 因此,在bar表上循環以構建動態部件,然后將它們連接在一起。

declare @sql varchar(2000)
set @sql=''
select @sql = @sql +' when bar.field='''+field+''' then foo.' + field
from (select distinct field from bar) sub

--print @sql

set @sql = 'select foo.tag, 
case ' + @sql  + ' 
    else null
end as value
from foo
    inner join bar on foo.tag = bar.tag'

--print @sql

exec(@sql)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM