【发布时间】:2017-08-14 17:18:39
【问题描述】:
在下面,第一行是标题,所有值都是|分隔。
我有一个名为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只有两列,分别是; 列名和值。
我还有一个名为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。
标签: sql-server tsql default-value calculated-columns