将字段递归连接到其已解析的段

时间:2018-10-30 19:04:36

标签: sql postgresql parsing recursion join

我有一个看起来像这样的表:

___COL_1___
'|A|B|C|'
'|D|A|'
'|X|Y|Z|A|'
'|Y|X|'
...

我想创建一个新表,如下所示:

___COL_1___ ...........    ___COL_2___
'|A|B|C|'.....................'|A|'
'|A|B|C|'.....................'|B|'
'|A|B|C|'.....................'|C|'
'|D|A|'........................'|D|'
'|D|A|'........................'|A|'
'|X|Y|Z|A|B|C|'...........'|X|'
'|X|Y|Z|A|B|C|'...........'|Y|'
'|X|Y|Z|A|B|C|'...........'|Z|'
'|X|Y|Z|A|B|C|'...........'|A|'
'|X|Y|Z|A|B|C|'...........'|B|'
'|X|Y|Z|A|B|C|'...........'|C|'
...

所以我想将组递归地加入字符串中的每个项目。

1 个答案:

答案 0 :(得分:2)

您不需要递归,只需:

  • 修剪该列的前|个字符,
  • 将结果转换为数组,
  • 嵌套数组,
  • 如果需要,添加|个字符。
with my_data(col1) as (
values
    ('|A|B|C|'),
    ('|D|A|'),
    ('|X|Y|Z|A|'),
    ('|Y|X|')
)
select 
    col1, 
    format('|%s|', unnest(string_to_array(trim(col1, '|'), '|'))) as col2
from my_data

   col1    | col2 
-----------+------
 |A|B|C|   | |A|
 |A|B|C|   | |B|
 |A|B|C|   | |C|
 |D|A|     | |D|
 |D|A|     | |A|
 |X|Y|Z|A| | |X|
 |X|Y|Z|A| | |Y|
 |X|Y|Z|A| | |Z|
 |X|Y|Z|A| | |A|
 |Y|X|     | |Y|
 |Y|X|     | |X|
(11 rows)