Eu tenho um aplicativo que armazena vários pontos de dados definidos pelo usuário sobre um registro em uma coluna XML. Não tenho controle sobre como eles são armazenados ou atualizados.
Quando consulta uma coluna, ela pode retornar 1 de 3 valores:
- O valor que
- Nulo
- Uma string vazia
Questão $ 64 Gostaria de retornar as cadeias vazias como nulos usando xpath.
Eu encontrei muitas respostas sobre retornar o nulo como uma picada vazia, mas nada dessa maneira.
Eles acabam assim quando alguém exclui o valor e, em vez de excluir a tag, ela a deixa em branco <value />
. Os nulos ocorrem quando o valor nunca foi definido. Eles não incluíram xsi: nil.
Eu fiz isso com uma declaração de caso:
select
so.SalesOrderId,
Case
when sopc.value('(Value)[1]','smalldatetime') IS null then Null
when sopc.value('(Value)[1]','smalldatetime') ='' then Null
Else sopc.value('(Value)[1]','smalldatetime')
End as sopc
From
SalesOrders so
Outer apply so.CustomColumns.nodes('/CustomColumnsCollection/CustomColumn[Name="ProjCompleted"]') sopc(sopc)
mas isso parece ineficiente e não é a única coluna, tornando o código longo e difícil de manter.
Editar para incluir dados de amostra
SalesOrderId CustomColumns
SO 1 "<CustomColumnsCollection>
<CustomColumn>
<Name>ProjCompleted</Name>
<DataType>1</DataType>
<Value />
</CustomColumn>
</CustomColumnsCollection>"
SO 2 "<CustomColumnsCollection>
<CustomColumn>
<Name>ProjCompleted</Name>
<DataType>1</DataType>
<Value>'2017-11-21'</Value>
</CustomColumn>
</CustomColumnsCollection>"
SO 3 "<CustomColumnsCollection>
</CustomColumnsCollection>"
**Output**
Current Desired
'' null
2017-11-21 2017-11-21
null null
Desde já, obrigado.
fonte
Respostas:
Especifique o
text()
nó dentro doValue
elemento. Esse nó está ausente quando você tem uma tag vazia.Tente o seguinte:
Resultado:
Geralmente, é bom especificar sempre o
text()
nó. O plano de consulta é mais simples e mais eficiente.fonte