【问题标题】:TSQL How to select employee with skills in xml columnTSQL如何在xml列中选择具有技能的员工
【发布时间】:2012-01-05 10:20:10
【问题描述】:

在如下表结构中

CREATE TABLE [dbo].[Employee](
    [EmployeeId] [uniqueidentifier] NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [Location] [nvarchar](50) NOT NULL,
    [Skills] [xml] NOT NULL
 CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED 
  • 假设Skills 列中保存的 xml 如下所示,我将如何让员工拥有 C#(不区分大小写)编程技能。

  • 您能否对其他功能提出建议在使用 xml 数据类型列时帮助我过滤、排序

<Skills><Skill>C#</Skill><Skill>ASP.NET</Skill><Skill>VB.NET</Skill></Skills>

【问题讨论】:

    标签: sql-server sql-server-2005 tsql xquery-sql


    【解决方案1】:

    比较区分大小写,因此您需要与 c# 和 C# 进行比较。在 SQL Server 2008 中,您可以使用 upper-case

    declare @T table
    (
      ID int identity,
      Skills XML
    )
    
    insert into @T values
    ('<Skills><Skill>C#</Skill><Skill>ASP.NET</Skill><Skill>VB.NET</Skill></Skills>')
    insert into @T values
    ('<Skills><Skill>CB.NET</Skill><Skill>ASP.NET</Skill><Skill>c#</Skill></Skills>')
    insert into @T values
    ('<Skills><Skill>F#</Skill><Skill>ASP.NET</Skill><Skill>VB.NET</Skill></Skills>')
    
    select ID
    from @T
    where Skills.exist('/Skills/Skill[contains(., "C#") or contains(., "c#")]') = 1
    

    结果:

    ID
    -----------
    1
    2
    

    更新:

    这也可以。

    select T.ID
    from @T as T
      cross apply T.Skills.nodes('/Skills/Skill') as X(N)
    where X.N.value('.', 'nvarchar(50)') like '%C#%'
    

    【讨论】:

    • 比较是否默认区分大小写?,可以在where子句中使用contains函数吗?
    • @Deeptechtons - 是的,默认情况下它区分大小写,您可以像这样使用包含。 '/Skills/Skill[contains(upper-case(.), "C#")]'
    • 这样? select * from Employee where Skills.query('/Skills/Skill[contains(upper-case(.), "C#")]') 奇怪我也得到错误There is no function '{http://www.w3.org/2004/07/xpath-functions}:upper-case()'
    • @Deeptechtons 关闭。就像答案中的查询一样,使用exist 而不是query
    • select * from employee where skills.exist('/Skills/Skill[contains(., "C#")]') = 1
    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多