sql-server - 测试 XML 列中的特定节点值,包括可能为空的节点

标签 sql-server xml xquery-sql

我在 SQL Server 2008 数据库中有一个 XML 列,其值类似于以下简化示例:

案例一

<root>
    <child>sometimes text here</child>
    <otherstuff ..... />
</root>

案例二

<root>
    <child/>
    <otherstuff ..... />
</root>

给定一个字符串值,我希望能够选择在“子”节点中具有特定值的行,包括情况 2 的选择。

例如,如果我有一个局部变量:

declare @queryText nvarchar(MAX)
select @queryText = 'sometimes text here'

我可以通过以下方式选择与案例 1 匹配的行:

select * from [my_table] 
where [my_xml_column].exist('/root/child[text()=sql:variable("@queryText")]') = 1

但是,对于情况 2,我希望 @queryText = '' 或 @queryText = NULL 起作用,但两者都不匹配。

作为解决方法,我可以使用:

select * from [my_table]
where [my_xml_column].value('(/root/child)[1], 'nvarchar(MAX)') = @queryText

这行得通,但它让我觉得我遗漏了一些东西,并使用一个肮脏的解决方法来测试 .value() 而不是 .exist() 的存在......是否有类似的表达我可以[并且应该?] 在 .exist() 中使用以匹配特定文本或空节点?除了可读性之外,还有什么理由需要关心吗?当有人指出我错过的任何明显的事情时,我期待着我即将到来的面部表情。 :)

最佳答案

在空元素上调用 text() 会导致 NULL 而不是空字符串。因此,在这两种情况下传递 @queryText = ''@queryText = NULL 永远不会等于 NULL。请记住,没有任何东西等于 NULL,甚至不等于 NULL。

请参阅下面的示例,该示例说明了如何使用 exist 进行填充或空搜索。

declare @my_table table (i int, my_xml_column xml)
insert into @my_table
    select 1, '<root><child>sometimes text here</child><otherstuff /></root>' union all
    select 2, '<root><child/><otherstuff/></root>'

declare @queryText varchar(100) = '';

select  *, 
        [using_text()]=[my_xml_column].value('(/root/child/text())[1]', 'varchar(max)'),
        [using_path]=[my_xml_column].value('(/root/child)[1]', 'varchar(max)')
from    @my_table

select  *
from    @my_table
where   [my_xml_column].exist('/root/child[.= sql:variable("@queryText")]') = 1

关于sql-server - 测试 XML 列中的特定节点值,包括可能为空的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11147655/

相关文章:

sql-server - 如何为 DbUnit 指定要插入的模式名称?

c# - 如何从 XML 文件中读取摘要

sql-server - 删除 XML 节点以匹配 SQLServer 中的属性条件

sql-server - 使用 SQL 选择单个 xml 节点

sql-server - 在将列添加到 SQL 表之前检查该列是否存在,而无需更改每列的表

c# - 什么是有意义的数据类型来节省时间

php - 数据以 64512 个字符结束 - MSSQL//PHP//OPENSuSE//APACHE2

mysql - 如何将XML数据导入mysql表

java - ExpandableListView:从子项获取输入值

xpath - 需要使用 sibling 、祖先的复杂 Xpath