2013-07-30 110 views
0

我有一个类似的表:提取某些字符串,并将其分配给相邻列

with tab as(
select 'P710345,P345123 are not valid' m from dual 
union all 
select 'P9,P234098,P675001 are not valid' m from dual) 
select * from tab 

我需要的是提取与P开头的字符串,并将这些字符串放到新列在同一排。

最终结果:

P710345,P345123 are not valid   | P710345 | P345123 |  | 
P9,P234098,P675001 are not valid | P9| P234098 |P675001 | 

我试图与regexp_substr提取:

with tab as(
select 'P710345,P345123 are not valid' m from dual 
union all 
select 'P9,P234098,P675001 are not valid' m from dual) 
select regexp_substr (m,'P\d\w+','2') b from tab 

我目前在这里停留。

+0

存储多个值是坏的数据库设计,最好的办法是改变设计,但如果它不可能,我会看看我是否可以写一些SQL来帮助 –

+0

谢谢。数据库设计是目前给出的。因为它不是生产数据库,所以我认为目前它是可以接受的。 – bonsvr

回答

0

我发现最简单的解决方法是做一个CSV文件,然后导入或在speedsheet程序使用它在一列

SELECT CONCAT(
    "'", m, "';'", 
    REPLACE(
    SUBSTR(m, 1, POSITION(' ' IN m)), 
    ',', 
    "';'"), 
    "';") 
FROM (SELECT 'P710345,P345123 are not valid' AS m FROM DUAL UNION ALL SELECT 'P9,P234098,P675001 are not valid' AS m FROM DUAL) AS t; 
+0

Oracle中是否有POSITION功能? – bonsvr

+0

甲骨文有像regexp_substr这样酷的功能,但没有位置/乐趣?我是一个MySQL用户:-)在寻找正则表达式问题时到了这里。只是使用任何其他funktion在空间 –

+0

文本切割mysql是真的很酷在某些方面:) – bonsvr

相关问题