首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL XML查询

MySQL XML查询
EN

Stack Overflow用户
提问于 2012-07-01 19:07:48
回答 3查看 14.9K关注 0票数 4

我对MySQL中的ExtractValue函数有点问题。

下面是我的示例XML:

代码语言:javascript
运行
复制
<As>
    <A>
        <B>Chan</B>
    </A>
    <A>
        <B>Shey</B>
    </A>
    <A>
        <B>Bob</B>
    </A>
</As>

以下是我当前的查询:

代码语言:javascript
运行
复制
SELECT ExtractValue(@XML, '/As/A/B')

结果如下:

代码语言:javascript
运行
复制
CHAN SHEY BOB

这是我想要的:

代码语言:javascript
运行
复制
CHAN
SHEY
BOB

有没有人能帮我实现这个目标..谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-12 04:32:07

这个问题的答案如下:

Parse an XML string in MySQL

如果您将子代更改为“B”,则该文章中的解决方案应该有效:

代码语言:javascript
运行
复制
DECLARE i INT DEFAULT 1;
DECLARE count DEFAULT ExtractValue(xml, 'count(//child)');

WHILE i <= count DO
SELECT ExtractValue(xml, '//child[$i]');
SET i = i+1;
END WHILE
票数 3
EN

Stack Overflow用户

发布于 2012-07-09 18:31:28

问题的解决方案需要使用numbers表:一个由整数组成的表,1,2,3,...直到某个合理的值,比如1024。

然后,您可以使用String Walking来解决问题。

下面是numbers表的CREATE TABLE语句:

代码语言:javascript
运行
复制
CREATE TABLE numbers (
  `n` smallint unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`n`)
)
;
INSERT INTO numbers VALUES (NULL);
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;
INSERT INTO numbers SELECT NULL FROM numbers;

上面的代码用值1..1024填充

现在是查询:

代码语言:javascript
运行
复制
SELECT 
  SUBSTRING_INDEX(SUBSTRING_INDEX(ExtractValue(@XML, '/As/A/B'), ' ', n), ' ', -1) AS value
FROM
  numbers
WHERE
  n BETWEEN 1 AND ExtractValue(@XML, 'count(/As/A/B)')
;


+-------+
| value |
+-------+
| Chan  |
| Shey  |
| Bob   |
+-------+
3 rows in set (0.02 sec)

我们使用ExtractValue(@XML, 'count(/As/A/B)')来获得XML3XML值--匹配的元素的数量。

通过数字1,2,3,我们从文本CHAN SHEY BOB中提取令牌#1,令牌#2,令牌#3,按空格拆分。

备注:

  • ExtractXML返回空格分隔的值。但是如果返回的文本中有一个空格,那就没用了。它与分隔空格没有区别。
  • 可以避免创建numbers表和generate the numbers on the fly。我建议不要这样做--这会产生很多开销。有一个1024行的表格总是很好的。

祝好运!

票数 4
EN

Stack Overflow用户

发布于 2012-07-01 19:16:32

您可能需要重新考虑您的数据库设计。关系数据库系统不支持一个字段中的多个值。ExtractValue是用来从字段中的XML数据中获取一个值的过滤器,而不是用来获取多行数据的。

您应该阅读有关数据库规范化的知识。所有表格应至少遵循first normal form (1NF),即每个字段中只有一个值。不满足1NF的表通常很难查询,因为一般的SQL和诸如MySQL之类的实现不会为您提供任何用于此类查询的好工具。

如果您仍然想处理您的非1NF表,我认为您可能需要从数据库中提取数据,并在应用程序代码中完成此工作。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11281436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档