Desejo selecionar um alias com base em critérios de coluna específicos e gerar o XML necessário.
Digamos que temos uma tabela chamada ACCOUNTS
:
Nome idade --------- --- John Doe 30 Mary Lane 40 Alice Bob 50
Consulta:
;WITH XMLNAMESPACES
(
'http://www.w3.org/2001/XMLSchema-instance' AS abc, 'uri' AS def
)
SELECT
CASE WHEN AGE <= 30 THEN 'BUYER' AS [def:GIRL]
WHEN AGE >=40 THEN 'SELLER' END AS [def:BOY]
FROM ACCOUNTS
FOR XML PATH('abc:OilCompany'), TYPE
A saída deve ser:
<abc:OilCompany>
<def:GIRL>BUYER</def:GIRL>
<def:BOY>SELLER</def:BOY>
<def:BOY>SELLER</def:BOY>
</abc:OilCompany>
Por padrão, o SQL Server não cria um nó para valores NULL, portanto, se você alterar sua consulta para usar duas instruções CASE e retornar NULL quando não houver correspondência, obterá o XML que está procurando.
dbfiddle
A mesma coluna com um nome diferente é SQL inválido, você precisa selecionar ambas as condições como colunas separadas:
Infelizmente, esta solução empurra os namespaces xml em todos os elementos.
A melhor maneira de evitar isso, de acordo com este anwser https://stackoverflow.com/questions/3242070/how-do-i-remove-redundant-namespace-in-nested-query-when-using-for-xml-path parece estar entrando no mundo não tão maravilhoso de
XML EXPLICIT
Deixando-nos com:
Ambas as soluções também causam 2 varreduras na mesma tabela - simplificadas em explícito: