sql - 如果表节点存在,SQL XML .node .query() 返回空字符串而不是 NULL
问题描述
如果表不存在,为什么 .query() 返回空字符串而不是 NULL?我是在 SQL 中查询 xml 的新手,所以我只是在玩,这是出乎意料的。
这是问题的一个例子。
declare @xml xml
set @xml = N'<xdoc><Header><OrderID>1234</OrderID><Detail><ProductID>12345</ProductID><Amount>12.50</Amount></Detail></Header></xdoc>'
SELECT
Tbl.Col.value('OrderID[1]', 'varchar(10)') as OrderID,
Tbl.Col.query('Detail') as Detail
FROM @xml.nodes('//Header') Tbl(Col)
set @xml = N'<xdoc><Header><OrderID>1234</OrderID></Header></xdoc>'
SELECT
Tbl.Col.value('OrderID[1]', 'varchar(10)') as OrderID,
Tbl.Col.query('Detail') as Detail
FROM @xml.nodes('//Header') Tbl(Col)
第一个 select 语句按预期返回。详细信息字段是表头中表详细信息的 xml。
但是,在第二个 select 语句中,此标头记录没有详细信息表,因此我希望该字段为 null 而不是空字符串。
解决方案
你想要的都是可能的,但你必须有一点不同的想法。在 XML 中,该值NULL
由缺少的节点指示。
此外,“价值”一词在这句话中非常重要。如果您要查找的元素不存在,该.value()
方法将返回。NULL
-.query()
方法在任何情况下都会返回一个 XML 类型的片段。
XML 由节点组成。元素(任何<SomeElement>
与所有嵌套节点一起)是一种特殊的节点。元素中的浮动文本本身就是一个节点。看看这些例子:
你的 XML
declare @xml xml
set @xml =
N'<xdoc>
<Header>
<OrderID>1234</OrderID>
<Detail>
<ProductID>12345</ProductID>
<Amount>12.50</Amount>
</Detail>
</Header>
</xdoc>'
--.query()
可以返回<Detail>
-fragment
SELECT @xml.query('/xdoc/Header/Detail');
<Detail>
<ProductID>12345</ProductID>
<Amount>12.50</Amount>
</Detail>
--该节点不存在。你得到的不是NULL
-value而是一个空的 XML 节点
SELECT @xml.query('/xdoc/Header/Dummy'); --<-- empty XML
——现在看.value()
SELECT @xml.value('(/xdoc/Header/Dummy)[1]','nvarchar(100)'); --<-- NULL
SELECT @xml.value('(/xdoc/Header/Detail)[1]','nvarchar(100)'); --<-- 1234512.50
SELECT @xml.value('(/xdoc/Header/Detail/text())[1]','nvarchar(100)'); --<-- NULL
SELECT @xml.value('(/xdoc/Header/Detail/ProductID)[1]','nvarchar(100)'); --<-- 12345
SELECT @xml.value('(/xdoc/Header/Detail/ProductID/text())[1]','nvarchar(100)');--<-- 12345
第一个电话很清楚,没有<Dummy>
,因此,我们得到了NULL
回报。
第二个电话可能会让你大吃一惊。值是元素内的所有内容。在这种情况下,我们得到所有值的组合。您可能已经将此视为模拟group_concat()的技巧。
第三次调用返回NULL
,因为没有text()
inside <Detail>
... ,第四次和第五次调用返回相同,但最后一个 withtext()
是最具体的,因此是最佳选择。
这取决于您的需求、您想要查询的内容以及您想要返回的内容。empty(SomeNode)
此外,您可以在 XPath 中使用诸如或not(empty(SomeNode))
使用 XQuery 过滤器之类的谓词。
推荐阅读
- python - 如何获取特定行号的日期时间索引值
- c++ - 在 linux 上,使用 C/C++ 编程时,我应该使用什么函数来输入密码?
- c# - 显示一些重复返回的 ASP 中继器
- python - 无法在 MacOS BigSur 中删除 Python 的符号链接
- mongodb - 运行 npm start 时在控制台中从 Mongodb Atlas 获取数据,但无法获取 URL
- datetime - 散点图的不同颜色渐变取决于时间(Matplotlib)
- css - 选中的 CSS 复选框问题在导航中不起作用
- python - 需要创建一个包含 100 个子列表的列表,每个子列表包含 3 个随机值
- html - 有没有办法使用 Selenium 获取当前固定在网站上的 ID 列表?
- css - 防止在 iOS 上突出显示文本