Oracle SQL更新XML列数据:在<a>标签内插入<b>标签包裹原有子节点
各数据库XML列更新语句实现
以下实现均假设表名为your_table,存储XML的列名为XML,可根据实际场景替换成你的表、列名。
SQL Server 实现
列类型为XML类型时
UPDATE your_table SET [XML].modify(' insert element b {(/a/node())} as first into (/a)[1] ') WHERE [XML].exist('/a') = 1;
exist('/a') = 1筛选根节点为的行,避免误改其他格式的XML- 语句会自动把下所有原有的子节点迁移到新生成的标签内部,的原有属性全部保留
- 原有为空的场景执行后也会生成
<a id="xxx"><b></b></a>的格式,完全符合需求
列类型为字符串类型(varchar/nvarchar)时
UPDATE your_table SET [XML] = CAST( CAST([XML] AS XML).query(' element a { /a/@*, element b { /a/node() } } ') AS NVARCHAR(MAX) ) WHERE CAST([XML] AS XML).exist('/a') = 1;
MySQL 实现
UPDATE your_table SET `XML` = UpdateXML( `XML`, '/a', CONCAT( '<a ', ExtractValue(`XML`, 'concat(/a/@*,"")'), '><b>', SUBSTRING_INDEX(SUBSTRING_INDEX(`XML`, '>', 2), '<', -1), '</b></a>' ) ) WHERE `XML` REGEXP '^<a[^>]*>';
- 用正则匹配筛选以标签开头的行
- 保留原有所有属性,把原有子内容全部封装到标签内
Oracle 实现
UPDATE your_table SET "XML" = XMLQuery( 'copy $tmp := . modify insert node element b {$tmp/a/node()} as first into $tmp/a return $tmp' PASSING "XML" RETURNING CONTENT ) WHERE XMLEXISTS('/a' PASSING "XML");
内容的提问来源于stack exchange,提问作者Chetan Kondawle
相关产品推荐
相关产品推荐

