Teradata sql 对长表达式进行子字符串化并生成新列

Teradata sql substring a long expression and generate new columns

我得到了每一行的长表达式,表达式的长度是不同的,'item id'是不同的,而且顺序也不一样。我知道一种做子串的方法,但我不知道如何得到我想要的结果。能否请你帮忙?提前致谢。

Table:

第 1 行:

<?xml version = '1.0'?>
<Data>
     <Item id="DDD">
         <!±DATA±444»»>
     </Item>
     <Item id="BBB">
         <!±DATA±222»»>
     </Item>
     <Item id="CCC">
         <!±DATA±333»»>
     </Item>
     ...
</Data>

第 2 行:

<?xml version = '1.0'?><Data><Item id="BBB"><!±DATA±022»»></Item><Item id="CCC"><!±DATA±033»»></Item><Item id="DDD"><!±DATA±044»»></Item>…<Item id="AAA"><!±DATA±011»»></Item>….</Item></Data>

第 3 行:

<?xml version = '1.0'?><Data><Item id="AAA"><!±DATA±001»»></Item><Item id="EEE"><!±DATA±005»»></Item><Item id="DDD"><!±DATA±044»»></Item>…<Item id="CCC"><!±DATA±003»»></Item>….</Item></Data>

期望的结果:

  ID       AAA     BBB    CCC   DDD   EEE  ...    
   1               222    333   444           ...
   2       011     022    033   044        ...
   3       001            003   044   005  ...
  ...      ...     ...    ...   ...   ...  ...

您可以为每一列应用 RegEx

RegExp_Substr(x,'<Item id="AAA">\s*<!±DATA±\K.+?(?=»»>)', 1,1,'i') AS AAA,
RegExp_Substr(x,'<Item id="BBB">\s*<!±DATA±\K.+?(?=»»>)', 1,1,'i') AS BBB,
...

它会查找 <Item id="AAA"> 的完全匹配项,然后是任何 space 个字符,然后是 *<!±DATA±,然后提取以下字符直至 »»>