按 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