从空XML节点中选择null的最佳方法是什么?
E.g。
DECLARE @xml xml = N'<t />'
SELECT @xml.value('(t)[1]','int')
这将返回0而不是NULL。为什么?如何提取null?
答案 0 :(得分:3)
空元素没有text()
。试试这个:
DECLARE @xml xml = N'<t />'
SELECT @xml.value('(t/text())[1]','int');
XML为每种数据类型使用定义的字符串格式。您肯定知道,INT
不是存储为数字链,而是存储在内部的二进制值。您在结果集中看到的内容以及为XML
生成的内容是人类读者遵循某些规则以确保正确阅读的字符串表示。日期和时间值应为ISO8601,BLOB将转换为base64
,依此类推......
每种数据类型都有一个默认值,INT
为0
。试试这个,没有XML也是一样:
SELECT CAST('' AS INT) --returns 0
,CAST(NULL AS INT) --returns NULL
XML中没有NULL
值(嗯,您可以指定XSINIL
来使用标记属性),但元素可能会丢失。只有缺失的元素才会被读为NULL
...
查看this answer,了解有关NULL
和empty
的一些示例。查看this answer以了解有关text()
答案 1 :(得分:0)
我也发现了这个功能:
DECLARE @xml xml = N'<t />'
SELECT @xml.query('/t').value('number(.)','int')
但是我想知道是否有,没有使用内部功能的方法。也许是一些命名空间。