Home >Database >Mysql Tutorial >How to Convert Comma-Separated Values into Rows in Oracle?

How to Convert Comma-Separated Values into Rows in Oracle?

DDD
DDDOriginal
2025-01-22 19:11:09379browse

How to Convert Comma-Separated Values into Rows in Oracle?

Convert comma separated values ​​to rows in Oracle

Comma is a common delimiter to represent multiple values ​​as a single string, but when working with data in Oracle, you may need to separate these values ​​into different rows. This can be achieved in a variety of ways.

Recursive query using regular expressions

One way is to use a recursive query with a regular expression to extract each value:

<code class="language-sql">select distinct id, trim(regexp_substr(value, '[^,]+', 1, level) ) value, level
from tbl1
connect by regexp_substr(value, '[^,]+', 1, level) is not null
order by id, level;</code>

This query uses the REGEXP_SUBSTR function to extract each non-comma substring and then concatenates the results using a recursive query.

Recursive query without regular expressions

Another recursive approach that avoids using regular expressions:

<code class="language-sql">WITH t ( id, value, start_pos, end_pos ) AS
  ( SELECT id, value, 1, INSTR( value, ',' ) FROM tbl1
  UNION ALL
  SELECT id,
    value,
    end_pos                    + 1,
    INSTR( value, ',', end_pos + 1 )
  FROM t
  WHERE end_pos > 0
  )
SELECT id,
  SUBSTR( value, start_pos, DECODE( end_pos, 0, LENGTH( value ) + 1, end_pos ) - start_pos ) AS value
FROM t
ORDER BY id,
  start_pos;</code>

This query uses the INSTR function to find the position of the comma, and then uses the SUBSTR function to extract the individual values.

CTE using recursive union

The third method uses a common table expression (CTE) with a recursive union:

<code class="language-sql">with t (id,res,val,lev) as (
           select id, trim(regexp_substr(value,'[^,]+', 1, 1 )) res, value as val, 1 as lev
             from tbl1
            where regexp_substr(value, '[^,]+', 1, 1) is not null
            union all           
            select id, trim(regexp_substr(val,'[^,]+', 1, lev+1) ) res, val, lev+1 as lev
              from t
              where regexp_substr(val, '[^,]+', 1, lev+1) is not null
              )
select id, res,lev
  from t
order by id, lev;</code>

This query uses the UNION ALL operator to create a recursive CTE that extracts every non-comma substring.

The above is the detailed content of How to Convert Comma-Separated Values into Rows in Oracle?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn