当 MySQL 中有多个匹配时更新 XML 节点
Update XML nodes when there are multiple matches in MySQL
我需要从 XML 中删除节点。
我尝试使用更新XML功能。
例如删除节点 C:
SELECT UpdateXML('<A><B>b_value<C>c_value1</C></B></A>', '/A/B/C', '')
结果:
'<A><B>b_value</B></A>'
但是当XML中有多个匹配时,函数returns原来的xml:
SELECT UpdateXML('<A><B>b_value<C>c_value1</C><C>c_value2</C></B></A>', '/A/B/C', '')
结果:
'<A><B>b_value<C>c_value1</C><C>c_value2</C></B></A>'
但我需要得到这样的结果:
'<A><B>b_value</B></A>'
如何在有多个匹配项时删除所有节点。
12.11 XML Functions :: UpdateXML
...
If no expression matching xpath_expr
is found, or if multiple matches
are found, the function returns the original xml_target
XML fragment. ...
...
一种可能的解决方法是使用存储过程:
DELIMITER //
CREATE PROCEDURE `sp_update_xml`(
`xml` TEXT,
`path` TEXT
)
BEGIN
DECLARE `current_item` BIGINT UNSIGNED
DEFAULT ExtractValue(`xml`,
CONCAT('COUNT(', `path`, ')')
);
WHILE `current_item` > 0 DO
SET `xml` := UpdateXML(`xml`,
CONCAT(`path`, '[', `current_item`, ']'),
''
),
`current_item` := `current_item` - 1;
END WHILE;
SELECT `xml`;
END//
DELIMITER ;
CALL `sp_update_xml`(@`xml`, '/A/B/C');
参见 db-fiddle。
我需要从 XML 中删除节点。
我尝试使用更新XML功能。
例如删除节点 C:
SELECT UpdateXML('<A><B>b_value<C>c_value1</C></B></A>', '/A/B/C', '')
结果:
'<A><B>b_value</B></A>'
但是当XML中有多个匹配时,函数returns原来的xml:
SELECT UpdateXML('<A><B>b_value<C>c_value1</C><C>c_value2</C></B></A>', '/A/B/C', '')
结果:
'<A><B>b_value<C>c_value1</C><C>c_value2</C></B></A>'
但我需要得到这样的结果:
'<A><B>b_value</B></A>'
如何在有多个匹配项时删除所有节点。
12.11 XML Functions :: UpdateXML
...
If no expression matching
xpath_expr
is found, or if multiple matches are found, the function returns the originalxml_target
XML fragment. ......
一种可能的解决方法是使用存储过程:
DELIMITER //
CREATE PROCEDURE `sp_update_xml`(
`xml` TEXT,
`path` TEXT
)
BEGIN
DECLARE `current_item` BIGINT UNSIGNED
DEFAULT ExtractValue(`xml`,
CONCAT('COUNT(', `path`, ')')
);
WHILE `current_item` > 0 DO
SET `xml` := UpdateXML(`xml`,
CONCAT(`path`, '[', `current_item`, ']'),
''
),
`current_item` := `current_item` - 1;
END WHILE;
SELECT `xml`;
END//
DELIMITER ;
CALL `sp_update_xml`(@`xml`, '/A/B/C');
参见 db-fiddle。