Saya memiliki aplikasi yang menyimpan berbagai titik data yang ditentukan pengguna tentang catatan dalam kolom XML. Saya tidak memiliki kendali atas bagaimana ini disimpan atau diperbarui.
Ketika saya meminta sebuah kolom, ia dapat mengembalikan 1 dari 3 nilai:
- Nilai
- Batal
- String kosong
$ 64 pertanyaan saya ingin mengembalikan string kosong tersebut sebagai null menggunakan xpath.
Saya telah menemukan banyak jawaban tentang mengembalikan null sebagai sengatan kosong tetapi tidak dengan cara ini.
Mereka berakhir seperti itu ketika seseorang telah menghapus nilai, dan alih-alih menghapus tag itu kosong menjadi <value />
tag. Nol terjadi ketika nilainya tidak pernah ditetapkan. Mereka belum memasukkan xsi: nihil.
Saya sudah melakukannya dengan pernyataan kasus:
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)
tetapi ini terasa tidak efisien dan ini bukan satu-satunya kolom sehingga membuat kode panjang dan sulit untuk dipelihara.
Edit untuk memasukkan data sampel
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
Terima kasih sebelumnya.
sumber
Jawaban:
Tentukan
text()
simpul di dalamValue
elemen. Node itu hilang ketika Anda memiliki tag kosong.Coba ini:
Hasil:
Merupakan hal yang baik secara umum untuk selalu menentukan
text()
node. Rencana kueri lebih sederhana dan lebih efisien.sumber