以XML数据类型搜索查询

时间:2012-04-10 10:28:31

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

我有一个要求,我想搜索xml数据类型的数据,从前端我会得到firstname,lastname,dob,email所有字段都不是必须的,有些字段会变为空或null我想要根据这个搜索,如果我将名字称为'test'而名字我会得到为空或为空

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

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

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

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

由于

2 个答案:

答案 0 :(得分:0)

在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

答案 1 :(得分:0)

我认为您可以使用通用表表达式实现此目的。 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=''