以下では、最初の行は見出しであり、すべての値は|区切られた次のように列名に基づいて別の表のデフォルト値を取得
Iは、の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である2つだけの列を有します。 列名および値。次のように
私は、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
注:である7つの列を、持っているDefaultValues。 AccountCode、名前、住所、SignatureRequired、PetRegistered、BrochureTypeとMembershipType。 PetRegisteredとMembershipTypeあり、この場合、私はDefaultValuesの対応する列の値がその場所を取るしたいNULLですのMemberInfoの値については、
。
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を使用します。 –