Split String by Delimiter into Columns in Oracle SQL

Split String by Delimiter into Columns in Oracle SQL

When working with data in Oracle SQL, it's not uncommon to encounter string values that contain multiple pieces of information separated by a delimiter. To analyze or manipulate such data effectively, we often need to split these strings into individual columns based on the specified delimiter. In this article, we will explore the methods for splitting a string by a delimiter into separate columns within Oracle SQL. We'll cover built-in functions, SQL query techniques, and provide practical examples to demonstrate how to transform concatenated data into a more usable and structured format. Whether you're dealing with comma-separated values or any other delimited data, by the end of this guide, you'll be equipped to handle such scenarios with ease in Oracle SQL.

Method 1: Utilizing APEX_STRING.SPLIT

The APEX_STRING.SPLIT function, available in Oracle Application Express (APEX), can be used even outside of the APEX environment to split a string into a PL/SQL collection. This function is particularly useful when you want to quickly turn a delimited string into a series of elements.

Here's how to use APEX_STRING.SPLIT to split a string and then pivot the resulting rows into columns:

WITH split_data AS (
  SELECT
    COLUMN_VALUE AS split_part,
    ROW_NUMBER() OVER (ORDER BY NULL) AS part_number
  FROM TABLE(APEX_STRING.SPLIT(your_column, your_delimiter))
)
SELECT *
FROM split_data
PIVOT (
  MAX(split_part)
  FOR part_number IN (1 AS col1, 2 AS col2, 3 AS col3) -- Extend as needed
);

In this code snippet, your_column is the column containing the string to be split, and your_delimiter is the delimiter character. The WITH clause creates a temporary view of the split data, which is then pivoted into columns.

Method 2: Using REGEXP_SUBSTR with CONNECT BY and PIVOT

Another approach is to first split the string into rows and then pivot these rows into columns. This can be achieved using the REGEXP_SUBSTR function in combination with a hierarchical query (CONNECT BY clause) and then using PIVOT to rotate the rows into columns.

Step 1: Splitting String into Rows

SELECT
  LEVEL as line_number,
  REGEXP_SUBSTR(your_column, '[^your_delimiter]+', 1, LEVEL) AS split_data
FROM
  your_table
CONNECT BY
  REGEXP_SUBSTR(your_column, '[^your_delimiter]+', 1, LEVEL) IS NOT NULL
  AND PRIOR SYS_GUID() IS NOT NULL
  AND PRIOR your_column = your_column;

Step 2: Pivoting Rows into Columns

WITH split_data AS (
  SELECT
    REGEXP_SUBSTR(your_column, '[^your_delimiter]+', 1, LEVEL) AS split_part,
    ROW_NUMBER() OVER (PARTITION BY your_column ORDER BY LEVEL) AS part_number
  FROM
    your_table
  CONNECT BY
    REGEXP_SUBSTR(your_column, '[^your_delimiter]+', 1, LEVEL) IS NOT NULL
    AND PRIOR SYS_GUID() IS NOT NULL
    AND PRIOR your_column = your_column
)
SELECT *
FROM split_data
PIVOT (
  MAX(split_part)
  FOR part_number IN (1 AS col1, 2 AS col2, 3 AS col3) -- Adjust the number of columns as required
);

Method 3: Using SUBSTR and INSTR Functions

For situations where the structure of the string is consistent and the number of expected elements is known, the SUBSTR and INSTR functions can be used to extract specific elements directly.

Here's an example of using these functions to split a string into two columns:

SELECT
  SUBSTR(your_column, 1, INSTR(your_column, your_delimiter, 1, 1) - 1) AS col1,
  SUBSTR(your_column, INSTR(your_column, your_delimiter, 1, 1) + 1) AS col2
FROM
  your_table;

This code extracts two elements based on a single delimiter within the string.

Conclusion

The ability to split strings into multiple columns is a vital operation in database management, and Oracle SQL provides several methods to accomplish this task. The APEX_STRING.SPLIT function is a versatile tool, especially when working within the APEX environment or when a quick solution is needed. The REGEXP_SUBSTR with CONNECT BY and PIVOT is a more dynamic approach that can handle strings with varying numbers of delimiters. Finally, the SUBSTR and INSTR methods offer a straightforward solution for simpler cases.