按 XML 属性值排序
Order by XML attribute value
我有以下table
EntityID | Data
-----------+-----------
1 | <xml data>
2 | <xml data>
3 | <xml data>
其中 XML 数据如下所示:
<Qualifications>
<Qualification QualificationName="Has Dr's degree" Remark="Yes" />
<Qualification QualificationName="ASP.NET Experience" Remark="1 Year" />
<Qualification QualificationName="Sex" Remark="M" />
</Qualifications>
我希望能够通过备注订购特定的资格名称
SELECT * 来自 Table
....
按 'ASP.NET Experience'
排序
P.S。
潜在地,我可以将 XML 更改为类似这样的内容,以使事情变得更简单
<Qualifications>
<Has Dr's degree>Yes</Has Dr's degree>
<ASP.NET Experience>1 Year</ASP.NET Experience>
<Sex>M</Sex>
</Qualifications>
UPD1:当用户想要通过 'ASP.NET Experience' 资格订购时,预期结果将是这样的:
EntityID | Data
-----------+-----------
3 | <xml data>
1 | <xml data>
2 | <xml data>
因为 EntityID 3 的备注为“1 年”,EntityID 1 的备注为“2 年”,而 EntityID 2 在 XML 列内的 'ASP.NET Experience' 资格备注为“3 年”
假设@QualificationName 标识您要订购的特定节点,这将为您提供备注的值。
declare @xml xml; set @xml = '<Qualifications>
<Qualification QualificationName="Has Dr%quot;s degree" Remark="Yes" />
<Qualification QualificationName="ASP.NET Experience" Remark="1 Year" />
<Qualification QualificationName="Sex" Remark="M" />
</Qualifications>'
declare @Qualification nvarchar(100); set @Qualification = 'ASP.NET Experience'
select @xml.value('(//Qualifications/Qualification[@QualificationName=sql:variable("@Qualification")]/@Remark)[1]', 'varchar(10)')
我假设你的 xml 是:
<Qualifications>
<HasDrsdegree>Yes</HasDrsdegree>
<ASPNETExperience>2</ASPNETExperience>
<Sex>M</Sex>
</Qualifications>
我希望这个查询能解决你的问题,这个查询会产生一个你可以忽略的额外列,但这会一次性解决你的问题table。
Select EntityID,Data,T2.Loc.value('.','int') as 'experience'
from [yourtablename]
cross apply Data.nodes('/Qualifications/ASPNETExperience') as T2(Loc)
order by experience
我有以下table
EntityID | Data
-----------+-----------
1 | <xml data>
2 | <xml data>
3 | <xml data>
其中 XML 数据如下所示:
<Qualifications>
<Qualification QualificationName="Has Dr's degree" Remark="Yes" />
<Qualification QualificationName="ASP.NET Experience" Remark="1 Year" />
<Qualification QualificationName="Sex" Remark="M" />
</Qualifications>
我希望能够通过备注订购特定的资格名称
SELECT * 来自 Table .... 按 'ASP.NET Experience'
排序P.S。 潜在地,我可以将 XML 更改为类似这样的内容,以使事情变得更简单
<Qualifications>
<Has Dr's degree>Yes</Has Dr's degree>
<ASP.NET Experience>1 Year</ASP.NET Experience>
<Sex>M</Sex>
</Qualifications>
UPD1:当用户想要通过 'ASP.NET Experience' 资格订购时,预期结果将是这样的:
EntityID | Data
-----------+-----------
3 | <xml data>
1 | <xml data>
2 | <xml data>
因为 EntityID 3 的备注为“1 年”,EntityID 1 的备注为“2 年”,而 EntityID 2 在 XML 列内的 'ASP.NET Experience' 资格备注为“3 年”
假设@QualificationName 标识您要订购的特定节点,这将为您提供备注的值。
declare @xml xml; set @xml = '<Qualifications>
<Qualification QualificationName="Has Dr%quot;s degree" Remark="Yes" />
<Qualification QualificationName="ASP.NET Experience" Remark="1 Year" />
<Qualification QualificationName="Sex" Remark="M" />
</Qualifications>'
declare @Qualification nvarchar(100); set @Qualification = 'ASP.NET Experience'
select @xml.value('(//Qualifications/Qualification[@QualificationName=sql:variable("@Qualification")]/@Remark)[1]', 'varchar(10)')
我假设你的 xml 是:
<Qualifications>
<HasDrsdegree>Yes</HasDrsdegree>
<ASPNETExperience>2</ASPNETExperience>
<Sex>M</Sex>
</Qualifications>
我希望这个查询能解决你的问题,这个查询会产生一个你可以忽略的额外列,但这会一次性解决你的问题table。
Select EntityID,Data,T2.Loc.value('.','int') as 'experience'
from [yourtablename]
cross apply Data.nodes('/Qualifications/ASPNETExperience') as T2(Loc)
order by experience