Sql 将列名与其他表中的数据匹配
我已经动态创建了一个临时表#temp1,它根据json字符串动态创建列。该表如下所示 #temp1 身份证件 领域 果 蔬菜 1. 字段1 A. B 2. 字段2 C DSql 将列名与其他表中的数据匹配,sql,sql-server,Sql,Sql Server,我已经动态创建了一个临时表#temp1,它根据json字符串动态创建列。该表如下所示 #temp1 身份证件 领域 果 蔬菜 1. 字段1 A. B 2. 字段2 C D 您需要使用动态查询,因为您的列是动态的 declare @sql nvarchar(max), @case_stmt nvarchar(max) -- form the case statement select @case_stmt = STRING_AGG ('WHEN ''' + type
您需要使用
动态查询
,因为您的列是动态的
declare @sql nvarchar(max),
@case_stmt nvarchar(max)
-- form the case statement
select @case_stmt = STRING_AGG ('WHEN ''' + type + ''' THEN t1.' + quotename(t.type), char(13))
from typ t
where exists
(
select *
from result r
where t.type_id = r.type_id
)
-- Print out for insepction
print @case_stmt
-- form final query
select @sql = 'update r' + char(13)
+ 'set value = CASE t.type' + char(13)
+ @case_stmt + char(13)
+ 'END'+ char(13)
+ 'from result r' + char(13)
+ 'inner join #temp1 t1 on r.Field = t1.Field' + char(13)
+ 'inner join typ t on r.type_id = t.type_id' + char(13)
-- Print out for insepction
print @sql
exec (@sql);
select *
from result
注:char(13)
是新行。它有助于对查询进行简单的格式化
如果结果表确实已经有一条已经包含字段和类型id的现有记录,如您所述,那么我认为您可以尝试以下方法:
UPDATE B
SET B.value =
CASE WHEN
D.type = ‘FRUIT’
THEN
T.FRUIT
WHEN
D.type = ‘VEGE’
THEN T.VEGE
END
FROM result_table B
INNER JOIN #temp1 T ON T.field = B.field
INNER JOIN type_table D on D.type_id = B.type_id
但是,这将要求您对希望在将来更新的每种类型的id都有一个额外的CASE语句
如果您有可能更改临时表创建和填充JSON对象的方式,那么请考虑构造这样的临时表,而不是:
身份证件 领域 类型 价值 1. 字段1 果 A. 2. 字段1 蔬菜 B 3. 字段2 果 C 4. 字段2 蔬菜 D请包括您的查询尝试。以及获得所需结果所需的逻辑。由于表类型通常较大,是否有任何替代方案不在用例中使用??可能只是将列名和类型
JOIN
typ
之间的匹配值返回到@case\u stmt
的表,或者使用EXISTS()
我想你的答案是我所期望的,但我有一个错误:无法解决“Latin1\u General\u CI\u AI”和“Latin1_General_CI_AS”在等于操作中。您还可以显示@case_stmt或use EXISTS()的连接类型到结果表的查询吗?添加了JOIN
到@case_stmt