在下面的第一行是標題,所有值都是|分隔。根據列名從另一個表中獲取默認值
我有一個名爲的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。 –