posix regexp来拆分表

posix regexp来拆分表,regex,postgresql,posix,Regex,Postgresql,Posix,我目前正在PostgreSQL中进行数据迁移。由于我是posix正则表达式的新手,我在使用一个简单的模式时遇到了一些问题,非常感谢您的帮助 我想让一个正则表达式在一列中的每个字母数字字符上拆分我的表,例如,当一列包含字符串'abc'时,我想将其拆分为3行:['a','b','c']。我需要一个regexp 第二种情况稍微复杂一些,我想把一个表达式'105AB'拆分成['105A','105B'],我想复制字符串开头的数字,并按大写字母拆分表格,最后将数字与1个大写字母连接起来 我将使用的函数可能

我目前正在PostgreSQL中进行数据迁移。由于我是posix正则表达式的新手,我在使用一个简单的模式时遇到了一些问题,非常感谢您的帮助

我想让一个正则表达式在一列中的每个字母数字字符上拆分我的表,例如,当一列包含字符串
'abc'
时,我想将其拆分为3行:
['a','b','c']
。我需要一个regexp

第二种情况稍微复杂一些,我想把一个表达式
'105AB'
拆分成
['105A','105B']
,我想复制字符串开头的数字,并按大写字母拆分表格,最后将数字与1个大写字母连接起来

我将使用的函数可能是
regexp\u split\u to\u table(string,regexp)


我故意提供很少的数据,以免混淆任何人,因为我发布的内容是问题的本质。如果您需要更多信息,请发表评论。

您已经解决了第一个问题:

select regexp_split_to_table(s, ''), i
from (values
    ('abc', 1),
    ('def', 2)
) s(s, i);
 regexp_split_to_table | i 
-----------------------+---
 a                     | 1
 b                     | 1
 c                     | 1
 d                     | 2
 e                     | 2
 f                     | 2
在第二种情况下,您不会说数字是否总是第一个树字符:

select
    left(s, 3) || regexp_split_to_table(substring(s from 4), ''), i
from (values
    ('105AB', 1),
    ('106CD', 2)
) s(s, i);
 ?column? | i 
----------+---
 105A     | 1
 105B     | 1
 106C     | 2
 106D     | 2
对于可变数量的数字:

select n || a, i
from (
    select
        substring(s, '^\d{1,3}') n,
        regexp_split_to_table(substring(s, '[A-Z]+'), '') a,
        i
    from (values
        ('105AB', 1),
        ('106CD', 2)
    ) s(s, i)
) s;
 ?column? | i 
----------+---
 105A     | 1
 105B     | 1
 106C     | 2
 106D     | 2

第一个解决方案有效,感谢第二个,数值长度是可变的(1-3),但你的想法推动了我,我将尝试使用regexp_replace处理此问题,并可能在接下来的15分钟内解决此问题:)谢谢lot@fetta如果您还没有计算出来,请检查我编辑的答案。我以不同的方式完成了它:
regexp_replace(t2.oddzial,[~a-Za-z]+','')| | regexp_split_to_table(regexp_replace)(t2.oddzial,[0-9]+',''),'[~a-z]+','','')odd
其中t2.oddzial是我要拆分的列再次感谢:)