Teradata SQL子字符串一个长表达式并生成新列

时间:2018-06-29 14:26:27

标签: sql teradata

我对于每一行都有一个长表达式,表达式的长度是变化的,'item id'是不同的,并且顺序也不相同。我知道一种做子字符串的方法,但是我不知道如何获得想要的结果。能否请你帮忙?预先感谢。

表格:

第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  ...
  ...      ...     ...    ...   ...   ...  ...

1 个答案:

答案 0 :(得分:1)

您可以为每个列应用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">,后跟任何空格字符,后跟*<!±DATA±,然后提取以下字符,直到»»>