我有一个要求,我想搜索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)')
由于
答案 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=''