2017-03-03 2 views
0

Wie kann/kann ich CASE innerhalb SELECT..FOR XML verwenden?CASE innerhalb SELECT..FOR XML zu erstellen bedingten Element

Wenn dies nicht möglich ist, gibt es eine Möglichkeit, den gewünschten Elementnamen zu bestimmen und einen Wert einzugeben. Die Logik wäre if amount < 0 then create <PostClassDt> element else <PostClassCr>. Die Beträge stammen aus derselben Tabelle.

Etwas wie folgt aus:

<Document> 
    <TxnList> 
    <Txn> 
     <Amt Curr="EUR">-123.45</Amt> 
     <PostClassDt>debit</PostClassDt> 
     </Txn> 
     <Txn> 
     <Amt Curr="USD">456.78</Amt> 
     <PostClassCr>return</PostClassCr> 
    </Txn> 
    </TxnList> 
</Document> 

Antwort

1

Sie benötigen zwei Spalten zu erstellen, und stellen Sie die, die Sie nicht NULL wollen, dann NULL Elemente erzeugen keine Knoten, z.B.

SELECT [Amt/@Curr] = t.Curr, 
     t.Amt, 
     PostClassDt = CASE WHEN Amt < 0 THEN 'debit' END, 
     PostClassCr = CASE WHEN Amt >= 0 THEN 'return' END 
FROM (VALUES 
      ('EUR', -123.45), 
      ('USD', 456.78) 
     ) t (Curr, Amt) 
FOR XML PATH('Txn'), ROOT('TxnList'); 

Dies gibt:

<TxnList> 
    <Txn> 
    <Amt Curr="EUR">-123.45</Amt> 
    <PostClassDt>debit</PostClassDt> 
    </Txn> 
    <Txn> 
    <Amt Curr="USD">456.78</Amt> 
    <PostClassCr>return</PostClassCr> 
    </Txn> 
</TxnList> 
+1

Great! Nur ein winziger Hinweis: Wenn 'Amt = 0 'würde nichts erzeugt werden. Eine Option sollte '> =' oder '<=' ... sein. – Shnugo