【问题标题】:Where clause when using XML in SQL [duplicate]在 SQL 中使用 XML 时的 Where 子句 [重复]
【发布时间】:2013-05-05 06:33:28
【问题描述】:

我目前在 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 新手。

【问题讨论】:

  • 您在使用哪些 RDBM,MS SQL Server、Oracle 等。重新标记您的问题,使其具有更好的可见性,从而引起一些关注
  • 另外,检查您的 XML sintax,第 3 行和第 4 行没有正确的结束标记。应该是artist-mainartist-feature。我猜最后有一个结束 &lt;/song&gt; 标记。
  • @Yaroslav 我正在使用 MS SQL 2012
  • @John 我刚刚查看了链接。谢谢,但发现它有点先进。我刚刚开始使用 sql 不到 10 小时 :)
  • @FloodGravemid,没问题。真正的关键在于,当涉及到 XML 字段时,您根本没有使用 SQL。您实际上正在使用一种 XPath 形式。该问题具有解释其工作原理的链接。您可以将 XML 视为文本并使用字符串操作技术,就像您在示例中所做的那样,但通常最好在 XML 上使用特定于 XML 的工具。

标签: sql sql-server xml sql-server-2012


【解决方案1】:

试试这个:

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%'

【讨论】:

  • 你在回答所有的 xml sql 问题吗 :)
  • 否 :)。最近学了一些xml,所以才知道答案。
  • @Mike 我可以在此语句中使用“=”运算符而不是“Like”吗?还有一件事“[1]”意味着什么?谢谢
  • 获取 - 无法调用 nvarchar(max) 上的方法。
【解决方案2】:

你需要使用 .value 函数。

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

【讨论】:

  • 我可以在此语句中使用“=”运算符而不是“Like”吗?还有一件事,“[1]”意味着什么?谢谢
  • 是的,你可以。只需删除通配符即可。此外,[1] 表示您将在该歌曲/艺术​​家主节点返回第一个值。那就是你想要的。 John M Gant 上面的链接也提到了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 2019-04-21
  • 1970-01-01
  • 2016-07-21
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多