我们有一个非规范化的表,其中包含外键密钥信息作为列中的自由文本。
我想创建一个视图来转换和规范化该表。
E.g。包含以下文本的列:
"REFID:12345, REFID2:67890"
我想创建一个视图,将REFID1和REFID2作为2个单独的整数列。
这可能在Oracle中吗?什么是aproaches,什么是表现最好的。
答案 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
);