在下面的第一行是标题,所有值都是|分隔。根据列名从另一个表中获取默认值
我有一个名为的MemberInfo表,如下所示:
ColumnName|Value
AccountCode|FredsDiscounts
Id|1
Name|Joe Bloggs
Address|1 Puddle lane, PL99 9PL
SignatureRequired|0
PetRegistered|NULL
BrochureType|Post
MembershipType|NULL
注:的MemberInfo只有两列,它们是; ColumnName and Value。
我有一个名为DefaultValues另一个表,如下所示:
AccountCode|Name|Address|SignatureRequired|PetRegistered|BrochureType|MembershipType
FredsDiscounts|Unknown|Unknown|1|0|Email|Normal
JillsSupers|Unknown|Unknown|1|0|Post|Super
GreggsFurniture|Unknown|Unknown|1|0|Email|None
JeremySwift|Unknown|Unknown|1|0|Telephone|Normal
注:DefaultValues七列,它们是; AccountCode,名称,地址,SignatureRequired,PetRegistered,BrochureType和MembershipType。
对于值的MemberInfo是NULL,在这种情况下是PetRegistered和MembershipType我想从相应的列在DefaultValues值来取代他们的位置。
应该根据AccountCode选择使用哪一行。
期望的结果将是,如下所示:
AccountCode|FredsDiscounts
ColumnName|Value
Id|1
Name|Joe Bloggs
Address|1 Puddle lane, PL99 9PL
SignatureRequired|0
PetRegistered|0
BrochureType|Post
MembershipType|Normal
我不知道该怎么事先不知道它的名字引用列。
我目前采用的方法如下:
DECLARE
@AccountCode VARCHAR(MAX) = 'FredsDiscounts'
SELECT
MemberInfo.ColumnName,
CASE WHEN MemberInfo.Value IS NOT NULL THEN MemberInfo.Value ELSE Defaults.[DefaultValue] END AS Value
FROM
MemberInfo
LEFT OUTER JOIN (
(SELECT 'AccountCode' AS [ColumnName], @AccountCode AS [DefaultValue]) UNION
(SELECT TOP 1 'Name' AS [ColumnName], DefaultValues.[Name] AS [DefaultValue] FROM DefaultValues WHERE DefaultValues.Accountcode = @AccountCode) UNION
(SELECT TOP 1 'Address' AS [ColumnName], DefaultValues.[Address] AS [DefaultValue] FROM DefaultValues WHERE DefaultValues.Accountcode = @AccountCode) UNION
(SELECT TOP 1 'SignatureRequired' AS [ColumnName], DefaultValues.[SignatureRequired] AS [DefaultValue] FROM DefaultValues WHERE DefaultValues.Accountcode = @AccountCode) UNION
(SELECT TOP 1 'PetRegistered' AS [ColumnName], DefaultValues.[PetRegistered] AS [DefaultValue] FROM DefaultValues WHERE DefaultValues.Accountcode = @AccountCode) UNION
(SELECT TOP 1 'BrochureType' AS [ColumnName], DefaultValues.[BrochureType] AS [DefaultValue] FROM DefaultValues WHERE DefaultValues.Accountcode = @AccountCode) UNION
(SELECT TOP 1 'MembershipType' AS [ColumnName], DefaultValues.[MembershipType] AS [DefaultValue] FROM DefaultValues WHERE DefaultValues.Accountcode = @AccountCode)
) AS Defaults ON [Defaults].[ColumnName] = MemberInfo.[ColumnName]
...不是很优雅。
这样做的正确方法是什么?
您将对这两个表使用左连接,然后使用ISNULL或COALESCE。 –