如何使用正则表达式创建将一列拆分为2或更多的视图?

时间:2010-08-12 21:42:15

标签: sql regex oracle etl

我们有一个非规范化的表,其中包含外键密钥信息作为列中的自由文本。

我想创建一个视图来转换和规范化该表。

E.g。包含以下文本的列:

"REFID:12345, REFID2:67890"

我想创建一个视图,将REFID1和REFID2作为2个单独的整数列。

这可能在Oracle中吗?什么是aproaches,什么是表现最好的。

2 个答案:

答案 0 :(得分:3)

Oracle10g +支持regular expressions; you could use REGEXP_SUBSTR

SELECT REGEXP_SUBSTR(text, '[:digit:]{5}', 1, 1) AS first_refid,
       REGEXP_SUBSTR(text, '[:digit:]{5}', 1, 2) AS second_refid
  FROM TABLE

答案 1 :(得分:1)

如果REFID / REFID2标签的顺序可能会改变,您可以使用:

WITH d AS (
   SELECT 'REFID:12345, REFID2:67890' id_list FROM DUAL
   UNION ALL
   SELECT 'REFID2:111, REFID:222' FROM DUAL
)
SELECT id_list
      ,CASE WHEN INSTR(refid,',') > 0
            THEN SUBSTR(refid, 1, INSTR(refid,',')-1)
            ELSE refid
       END AS refid
      ,CASE WHEN INSTR(refid2,',') > 0
            THEN SUBSTR(refid2, 1, INSTR(refid2,',')-1)
            ELSE refid2
       END AS refid2
FROM (
   SELECT id_list
         ,SUBSTR(id_list
                ,INSTR(id_list,'REFID:')+6
                ) AS refid
         ,SUBSTR(id_list
                ,INSTR(id_list,'REFID2:')+7
                ) AS refid2
   FROM d
);