首页 >数据库 >mysql教程 >如何在 Oracle 中将逗号分隔值拆分为多行而不重复?

如何在 Oracle 中将逗号分隔值拆分为多行而不重复?

Patricia Arquette
Patricia Arquette原创
2024-12-30 12:32:10549浏览

How to Split Comma-Separated Values in Oracle into Multiple Rows Without Duplicates?

将 Oracle 表中的多个逗号分隔值拆分为多行且不重复

在处理 Oracle 表中的数据时,经常需要这样做将逗号分隔值拆分为多行。使用 CONNECT BY 和正则表达式的组合可以实现这一点。但是,避免查询结果中出现重复行非常重要。

拆分逗号分隔值的查询

WITH CTE AS (
  SELECT 'a,b,c,d,e' temp, 1 slno FROM DUAL
  UNION
  SELECT 'f,g' temp, 2 slno FROM DUAL
  UNION
  SELECT 'h' temp, 3 slno FROM DUAL
)

SELECT TRIM(REGEXP_SUBSTR(temp, '[^,]+', 1, level)), slno
FROM CTE
CONNECT BY level <= REGEXP_COUNT(temp, '[^,]+')
AND PRIOR slno = slno
AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL

说明

此查询使用递归WITH子句创建一个名为的公共表表达式(CTE)热膨胀系数。 CTE 包含三行带有逗号分隔值的数据。

然后主 SELECT 语句从 temp 列中提取各个值。 TRIM 函数用于删除值中的任何前导或尾随空格。 REGEXP_SUBSTR() 函数负责根据逗号分隔符将临时列拆分为单独的值。

CONNECT BY 子句执行递归拆分。它确保为每个逗号分隔的值分配一个唯一的级别。 PRIOR slno = slno 条件确保级别仅在每行 (slno) 内递增。

此外,PRIOR DBMS_RANDOM.VALUE IS NOT NULL 条件用于防止生成重复行。 DBMS_RANDOM.VALUE 是一个返回随机数的伪列。通过将其与 IS NOT NULL 进行比较,我们引入了一个消除重复项的随机元素。

最终结果是一个包含多行的表,每行包含来自原始逗号分隔字符串的单个值。这种方法有效地分割了值,而不会产生任何重复的行。

以上是如何在 Oracle 中将逗号分隔值拆分为多行而不重复?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn