【问题标题】:Search query in XML datatypeXML 数据类型的搜索查询
【发布时间】:2012-04-22 15:23:09
【问题描述】:

我有一个要求,我想搜索 xml 数据类型的数据,从前端我会得到名字,姓氏,dob,电子邮件所有字段都不是强制性的,有些字段会为空或 null 我想根据该搜索,如果我将 firstname 设为“test”,lastname 将设为空或 null

如果它是 varchar 数据类型,那么我可以将查询创建为

FirstName= ISNULL(@firstname, FirstName) or COALESCE(@firstname, FirstName, '') = '')

但是在 XML 文档中我如何使用这种类型的查询。

xmlDoc.value('(/personalDetails/firstname)[1]','varchar(100)')

谢谢

【问题讨论】:

    标签: mysql sql sql-server xml sql-server-2008


    【解决方案1】:

    在 SQLServer 2008 中,我会写如下内容:

    select 
        xmlDoc.value('(personalDetails/firstname/text())[1]','varchar(100)') as firstname 
    from 
        myTable 
    where 
        not xmlDoc is null
        and xmlDoc.exist('personalDetails/firstname[.!='''']')>0
    

    如果你想为不存在的值返回 NULL,你也可以做一个 CASE WHEN ... ELSE ... END

    【讨论】:

      【解决方案2】:

      我认为您可以使用公用表表达式来实现这一点。 PFB示例代码-

      DECLARE @XMLData XML
      SET @XMLData ='
      <STUDENTS>
        <STUDENT>
          <StudentID>1</StudentID>
          <Name>John Smith</Name>
          <Marks>200</Marks>
        </STUDENT>
        <STUDENT>
          <StudentID>2</StudentID>
          <Name>Mark Johnson</Name>
          <Marks>300</Marks>
        </STUDENT>
      <STUDENT>
          <StudentID>3</StudentID>
          <Name></Name>
          <Marks>400</Marks>
        </STUDENT>
      </STUDENTS>'
      ;with cte as(
      SELECT StudentID = Node.Data.value('(StudentID)[1]', 'INT')
              , [Name] = Node.Data.value('(Name)[1]', 'VARCHAR(MAX)')
              , [Marks] = Node.Data.value('(Marks)[1]', 'INT')
      FROM    @XMLData.nodes('/STUDENTS/STUDENT') Node(Data)
      )
      Select * from cte where Name=''
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多