Tengo una aplicación que almacena varios puntos de datos definidos por el usuario sobre un registro en una columna XML. No tengo control sobre cómo se almacenan o actualizan.
Cuando consulto una columna, puede devolver 1 de 3 valores:
- El valor
- Nulo
- Una cadena vacía
Pregunta de $ 64 Me gustaría devolver esas cadenas vacías como nulas usando xpath.
He encontrado muchas respuestas sobre devolver el nulo como una picadura vacía, pero nada de esta manera.
Terminan de esa manera cuando alguien ha eliminado el valor y, en lugar de eliminar la etiqueta, la pone en blanco en una <value />
etiqueta. Los valores nulos se producen cuando el valor nunca se ha establecido. No han incluido xsi: nil.
Lo hice con una declaración 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)
pero esto se siente ineficiente y esta no es la única columna, por lo que hace que el código sea largo y difícil de mantener.
Editar para incluir datos de muestra
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
Gracias por adelantado.
fuente
Respuestas:
Especifique el
text()
nodo dentro delValue
elemento. Ese nodo falta cuando tiene una etiqueta vacía.Prueba esto:
Resultado:
En general, es bueno especificar siempre el
text()
nodo. El plan de consulta es más simple y más eficiente.fuente