将 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中文网其他相关文章!