在我的情况下,xml数据保存在文本列中,如何针对此列进行查询?例如:
create table t1
(
id INT IDENTITY(1, 1) PRIMARY KEY,
content text
)
insert into t1(content) values ('<?xml version="1.0"?>
<people>
<person>
<firstName>ooo</firstName>
<lastName>ppp</lastName>
</person>
</people>
')
insert into t1(content) values ('<?xml version="1.0"?>
<people>
<person>
<firstName>mmm</firstName>
<lastName>nnn</lastName>
</person>
<person>
<firstName>aaa</firstName>
<lastName>bbb</lastName>
</person>
</people>
')
insert into t1(content) values ('<?xml version="1.0"?>
<people>
<person>
<firstName>aaa</firstName>
<lastName>bbb</lastName>
</person>
</people>
')
如何获取所有拥有某个人的行,其名字 aaa 且姓氏为 bbb
编辑:
我稍微更改了insert语句,以便您可以直接将其强制转换为 XML 类型。
注意:
内容列的类型为文字,因为它是一个代表我实际问题的示例。我正在做一个遗留项目。
第二行和第三行的名字是 aaa ,姓氏是 bbb ,我只需要这些行。
答案 0 :(得分:4)
以下内容应该:
SELECT
*
FROM
(
SELECT
CAST([content] AS XML) AS xmlcontent
FROM
t1
) det
WHERE
xmlcontent.exist('//person[firstName[text()="aaa"] and lastName[text()="bbb"]]') = 1
我还将此条目添加到您的设置中:
insert into t1(content) values ('<?xml version="1.0"?>
<people>
<person>
<firstName>ooo</firstName>
<lastName>ppp</lastName>
</person>
<person>
<firstName>aaa</firstName>
<lastName>ppp</lastName>
</person>
<person>
<firstName>ooo</firstName>
<lastName>bbb</lastName>
</person>
</people>
')
表示如果同时匹配名字的人和匹配姓氏的其他人,则不会将其视为匹配。
答案 1 :(得分:0)
试试这个:
SELECT * FROM t1
WHERE content.value('(//firstName)[1]', 'varchar(MAX)') = 'aaa'
答案 2 :(得分:0)
窃取Dusty的答案,然后以下工作,如果你在插入语句中删除了开头引号和xml声明之间的新行:
SELECT * FROM t1
WHERE CONVERT(xml,content).value('(//firstName)[1]', 'varchar(8000)') = 'aaa'
答案 3 :(得分:0)
这是一个使用变量搜索内容的解决方案,因此您不必连接现有查询。
DECLARE @t1 table (
id INT IDENTITY(1, 1) PRIMARY KEY,
content xml
);
insert into @t1(content) values ('<?xml version="1.0"?>
<people>
<person>
<firstName>ooo</firstName>
<lastName>ppp</lastName>
</person>
</people>');
insert INTO @t1(content) values ('<?xml version="1.0"?>
<people>
<person>
<firstName>mmm</firstName>
<lastName>nnn</lastName>
</person>
<person>
<firstName>aaa</firstName>
<lastName>bbb</lastName>
</person>
</people>');
insert into @t1(content) values ('<?xml version="1.0"?>
<people>
<person>
<firstName>aaa</firstName>
<lastName>bbb</lastName>
</person>
</people>');
DECLARE @firstName nvarchar(50);
DECLARE @lastName nvarchar(50);
SELECT @firstName = 'aaa', @lastName = 'bbb';
SELECT * FROM @t1 t WHERE t.[content].[exist]('//person[firstName=sql:variable("@firstName") and lastName=sql:variable("@lastName")]')=1;