我对MySQL中的ExtractValue函数有点问题。
下面是我的示例XML:
<As>
<A>
<B>Chan</B>
</A>
<A>
<B>Shey</B>
</A>
<A>
<B>Bob</B>
</A>
</As>以下是我当前的查询:
SELECT ExtractValue(@XML, '/As/A/B')结果如下:
CHAN SHEY BOB这是我想要的:
CHAN
SHEY
BOB有没有人能帮我实现这个目标..谢谢。
发布于 2012-07-12 04:32:07
这个问题的答案如下:
如果您将子代更改为“B”,则该文章中的解决方案应该有效:
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发布于 2012-07-09 18:31:28
问题的解决方案需要使用numbers表:一个由整数组成的表,1,2,3,...直到某个合理的值,比如1024。
然后,您可以使用String Walking来解决问题。
下面是numbers表的CREATE TABLE语句:
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填充
现在是查询:
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,按空格拆分。
备注:
祝好运!
发布于 2012-07-01 19:16:32
您可能需要重新考虑您的数据库设计。关系数据库系统不支持一个字段中的多个值。ExtractValue是用来从字段中的XML数据中获取一个值的过滤器,而不是用来获取多行数据的。
您应该阅读有关数据库规范化的知识。所有表格应至少遵循first normal form (1NF),即每个字段中只有一个值。不满足1NF的表通常很难查询,因为一般的SQL和诸如MySQL之类的实现不会为您提供任何用于此类查询的好工具。
如果您仍然想处理您的非1NF表,我认为您可能需要从数据库中提取数据,并在应用程序代码中完成此工作。
https://stackoverflow.com/questions/11281436
复制相似问题