sql 中的条件 xml
Conditional xml in sql
我只想显示 categoryid
节点和值(如果它不是空的 guid
)。我尝试了不同的格式,但没有任何效果。它只在结果中将 if 语句打印为字符串。我读到你的代码中必须有一个 else 条件,我可以在那里放一个空的 string
吗?我在网上浏览了几篇关于这个的文章和 msdn 参考,但没有运气。出于某种原因,它正在评估我的 if
声明。
declare @XML xml = N'
<books>
<book>
<title>Book 1</title>
<categoryid>00000000-0000-0000-0000-000000000000</categoryid>
<author>Chris</author>
<price>10</price>
</book>
<book>
<title>Book 2</title>
<categoryid>DF3D696D-B7A3-44A2-BC7D-1D45745C979B</categoryid>
<author>Spencer</author>
<price>20</price>
</book>
</books>';
select @XML.query(
'<books>
{
for $b in /books/book
return
<book>
{$b/title}
{$b/price}
if(not($b/categoryid = 00000000-0000-0000-0000-000000000000))
then {$b/categoryid}
else
</book>
}
</books>'
);
我认为有两个问题。
1 - 条件块需要在 "if" 之前和 "else" 结束之后用大括号括起来。
2 - 空的 guid 值需要是它自己的变量 - 我认为在将其视为字符串的条件下。
我也无法让 "not" 运算符按预期运行,所以我只是反转条件以绕过该问题。
declare @XML xml = N'
<books>
<book>
<title>Book 1</title>
<categoryid>00000000-0000-0000-0000-000000000000</categoryid>
<author>Chris</author>
<price>10</price>
</book>
<book>
<title>Book 2</title>
<categoryid>DF3D696D-B7A3-44A2-BC7D-1D45745C979B</categoryid>
<author>Spencer</author>
<price>20</price>
</book>
</books>';
declare @emptyguid uniqueidentifier = '00000000-0000-0000-0000-000000000000'
select @XML.query('
<books>
{
for $b in /books/book
return
<book>
{$b/title}
{$b/price}
{
if($b/categoryid = sql:variable("@emptyguid")) then
()
else (
$b/categoryid
)
}
</book>
}
</books>
');
我只想显示 categoryid
节点和值(如果它不是空的 guid
)。我尝试了不同的格式,但没有任何效果。它只在结果中将 if 语句打印为字符串。我读到你的代码中必须有一个 else 条件,我可以在那里放一个空的 string
吗?我在网上浏览了几篇关于这个的文章和 msdn 参考,但没有运气。出于某种原因,它正在评估我的 if
声明。
declare @XML xml = N'
<books>
<book>
<title>Book 1</title>
<categoryid>00000000-0000-0000-0000-000000000000</categoryid>
<author>Chris</author>
<price>10</price>
</book>
<book>
<title>Book 2</title>
<categoryid>DF3D696D-B7A3-44A2-BC7D-1D45745C979B</categoryid>
<author>Spencer</author>
<price>20</price>
</book>
</books>';
select @XML.query(
'<books>
{
for $b in /books/book
return
<book>
{$b/title}
{$b/price}
if(not($b/categoryid = 00000000-0000-0000-0000-000000000000))
then {$b/categoryid}
else
</book>
}
</books>'
);
我认为有两个问题。
1 - 条件块需要在 "if" 之前和 "else" 结束之后用大括号括起来。
2 - 空的 guid 值需要是它自己的变量 - 我认为在将其视为字符串的条件下。
我也无法让 "not" 运算符按预期运行,所以我只是反转条件以绕过该问题。
declare @XML xml = N'
<books>
<book>
<title>Book 1</title>
<categoryid>00000000-0000-0000-0000-000000000000</categoryid>
<author>Chris</author>
<price>10</price>
</book>
<book>
<title>Book 2</title>
<categoryid>DF3D696D-B7A3-44A2-BC7D-1D45745C979B</categoryid>
<author>Spencer</author>
<price>20</price>
</book>
</books>';
declare @emptyguid uniqueidentifier = '00000000-0000-0000-0000-000000000000'
select @XML.query('
<books>
{
for $b in /books/book
return
<book>
{$b/title}
{$b/price}
{
if($b/categoryid = sql:variable("@emptyguid")) then
()
else (
$b/categoryid
)
}
</book>
}
</books>
');