【发布时间】:2019-08-26 08:34:30
【问题描述】:
我有 2 列
COLUMN1 || COLUMN2
15 || 23|45|65|44|66|15
34 || 45|21|16|34|79
我想将COLUMN2 区分为行,并与$0:15$1:23$1:45$1:65$1:44$1:66 等一些特殊语法合并。为了解决这个问题,这里有 2 个解决方案
- 我可以将级别分开,例如
SELECT COLUMN1,COLUMN2, REGEXP_SUBSTR(COLUMN2,'[^|]\d+',1,LEVEL)
FROM TABLE_NAME
CONNECT BY REGEXP_SUBSTR(COLUMN2,'[^|]\d+',1,LEVEL) IS NOT NULL
- 我可以将
COLUMN2与其他列分开并将其合并回来。但这会产生大量的regexp_substr功能。
问题就在这里,我对性能有巨大的影响。花了这么长时间。我正在寻找更有效的方法来做到这一点。行数超过1M。
编辑 1:
COLUMN1 将以$0: 开头,如果 COLUMN2 的分隔值相同,则不会在结果中考虑。
预期输出:
$0:15$1:23$1:45$1:65$1:44$1:66
$0:34$1:45$1:21$1:16$1:79
注意 Column1 不能是 column2 的第一个元素
【问题讨论】:
-
“我正在寻找更有效的方法。” 因为所有方法都需要扫描 FULL 表,所以很明显你应该规范化..
-
这个问题确实比较复杂。实际上分成行是必须的,因为可能需要区分 2,3 行并将其合并到一行中。我正在使用
full parallel(8)提示来提高性能。我以简单的方式问了这个问题,以获得一些简单的想法。现在我正在我的环境中发展你的想法。非常感谢@RaymondNijland
标签: sql oracle performance