繁体   English   中英

SQL Server - XQuery - 子串

[英]SQL Server - XQuery - Substring

在SQL Server上检索值AB的最佳方法是什么? 我有以下作为XML类型列的一部分。

<Data Name=""Teams"">
         <Data DataElement=""Test"" Value=""FirstTeam=A;SecondTeam=B;""/>
</Data>

是否更好地对查询结果进行子串(即使用sql substring)或者是否更有效地对xquery结果进行子串(即在xquery中使用子字符串)?

谢谢

您可以使用普通的xml.nodes从xml获取该值,然后根据需求解析该值

declare @xml xml =
'<Data Name="Teams">
         <Data DataElement="Test" Value="FirstTeam=A;SecondTeam=B;"/>
</Data>'

select x.r.value(N'@Value', N'varchar(100)') as val from @xml.nodes('Data/Data') as x(r)

作为XML类型列的一部分意味着什么?

  • 您的示例不是有效的XML(加倍"符号?)
  • 您的XML有一个奇怪的设计( Data中的嵌套Data ......)

有没有理由不这样(更好的查询!)?

<Teams>
  <Team DataElement="Test" Name="A"/>
  <Team DataElement="Test" Name="B"/>
</Teams>

由于XML(除了SQL Server)是一种固有的排名顺序,因此您不需要“第一”或“第二”团队。 那么,你可以添加一个属性来指定这个...

如果这是一个大型XML的片段,你必须考虑这一点

  • 真正的XML将在树下导航,只搜索<非常快
  • 多次出现你的目标(这会是Value=" ?)会导致意想不到的结果......
  • 您使用哪种数据类型进行存储? 希望这是XML ...对于SUBSTRING你必须做一个昂贵的演员......

所以我明确建议:使用真正的XML方法导航到给定的内容并分离@Value extra的内容。

尝试这样来获取内容:

DECLARE @XML XML=
'<Data Name="Teams">
         <Data DataElement="Test" Value="FirstTeam=A;SecondTeam=B;"/>
</Data>';
SELECT @XML.value('(//Data[@DataElement="Test"]/@Value)[1]','nvarchar(max)');

更新使用表格并即时拆分

DECLARE @tbl TABLE(YourXMLColumn XML);
INSERT INTO @tbl VALUES
(
'<Data Name="Teams">
         <Data DataElement="Test" Value="FirstTeam=A;SecondTeam=B;"/>
</Data>'
);

SELECT Team.value('.','nvarchar(max)') AS Team
FROM @tbl AS tbl
CROSS APPLY (SELECT CAST('<x>' + REPLACE(YourXMLColumn.value('(//Data[@DataElement="Test"]/@Value)[1]','nvarchar(max)'),';','</x><x>') + '</x>' AS XML)) AS Splitted(X)
CROSS APPLY X.nodes('x') AS The(Team)

结果

Team
-----------
FirstTeam=A
SecondTeam=B

(你可能会再将它分成两列,但这是你现在应该自己解决的问题:-)。

事实上,您必须拆分一个值才能获得必须再次拆分的条目,这清楚地表明,这不是最好的设计......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM