使用XML在SQL中时的Where子句

11

我目前在SQL表中使用XML数据类型

我的数据表看起来像这样

Id | Name | Surname | Title  | Location | Artist |
-------------------------------------------------------
1  | xxx  | abc     | def    | London   | XML    |
2  | xxx  | abc     | def    | Oslo     | XML    |
3  | xxx  | abc     | def    | New York | XML    |

我的 XML 文件长这样

<song category="gaming">
<title>Valentine's Day</title>
<artist-main>Fatfinger</artist-main>
<artist-featured>Slimthumb</artist-featured>
<year>2013</year>
<price>29.99</price>
<album>Gamestain</album>
<albumimg>http://download.gamezone.com/uploads/image/data/875338/halo-4.jpg</albumimg>
<songurl>http://www.youtube.com/watch?v=-J0ABq9TnCw</songurl>

现在,为了根据艺术家获取记录,我正在使用一个查询,即

SELECT 
Id, Name, Surname, Title 
FROM 
DATA 
WHERE 
Artist Like '%Fatfinger%' -- (this is user input)

在SQL查询XML数据方面,这是否是正确的方法?还是SQL中有任何内置函数可以处理XML数据。我对SQL不是很熟悉。


你正在使用哪些关系型数据库管理系统,如MS SQL Server、Oracle等?重新标记你的问题,以便更好地展示并吸引一些关注。 - Yaroslav
另外,请检查您的XML语法,第3行和第4行没有正确的闭合标签。应该是“artist-main”和“artist-feature”。我猜在结尾处有一个闭合的“</song>”标签。 - Yaroslav
@Yaroslav 我正在使用 MS SQL 2012。 - Flood Gravemind
@John,我刚刚看了一下链接。谢谢,但是我觉得有点高级了。我才刚刚开始使用SQL不到10个小时 :) - Flood Gravemind
1
@FloodGravemind,没问题。关键是当涉及到XML字段时,你根本没有使用SQL。实际上,你正在使用一种XPath形式。那个问题有解释它如何工作的链接。你可以将XML视为文本,并像你在示例中所做的那样使用字符串操作技术,但通常最好使用针对XML的特定工具。 - John M Gant
2个回答

14

试一试:

declare @table table (
Id int, Name varchar(50), Surname varchar(50), 
Title  varchar(50), Location varchar(50), Artist xml)

insert into @table (Id, Name, Surname, Title, Location , Artist )
values(1, 'xxx', 'abc', 'def', 'London', '<song category="gaming"></song>
<title>Valentines Day</title>
<artist-main>Fatfinger</artist-main>
<artist-featured>Slimthumb</artist-featured>
<year>2013</year>
<price>29.99</price>
<album>Gamestain</album>
<albumimg>http://download.gamezone.com/uploads/image/data/875338/halo-4.jpg</albumimg>
<songurl>http://www.youtube.com/watch?v=-J0ABq9TnCw</songurl>')

SELECT Id, Name, Surname, Title 
FROM @table 
WHERE Artist.value('(/artist-main)[1]','varchar(max)') LIKE '%FatFinger%'

1
你是在回答所有的 XML SQL 问题吗? :) - Jay Jay Jay
2
不 : )。我最近学习了一些 XML,所以我知道答案了。 - Jasmina Shevchenko
@Mike 我可以在这个语句中使用"="运算符代替"Like"吗?还有一个问题,"[1]"是什么意思?谢谢。 - Flood Gravemind
获取 - 无法在 nvarchar(max) 上调用方法。 - Abhilash V

9
您需要使用.value函数。
SELECT Id, Name, Surname, Title 
FROM DATA 
WHERE Artist.value('(/song/artist-main)[1]','varchar(max)') LIKE '%FatFinger%'

我可以在这个语句中使用“=”运算符代替“Like”吗?还有,“[1]”表示什么?谢谢。 - Flood Gravemind
可以的。只需删除通配符即可。此外,[1] 表示您将返回该歌曲/艺术家主节点中的第一个值。这就是你想要的。John M Gant 上面的链接也提到了这一点。 - Jeff B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接