【问题标题】:Oracle - CSV splitting only one column in a queryOracle - CSV 在查询中仅拆分一列
【发布时间】:2018-04-15 05:06:22
【问题描述】:

Oracle 12cR1 - 我将一个复杂的业务流程放入查询中。 一般来说,该过程将是

with t1 as (select CATEGORY, PRODUCT from ... )
select <some manipulation> from t1;

t1 -aka 第一行的输出 - 将如下所示:

CATEGORY       PRODUCT
Database       Oracle, MS SQL Server, DB2
Language       C, Java, Python

我需要 SQL 查询的第二行(也称为操作)来保留 CATEGORY 列,并在逗号上拆分 PRODUCT 列。输出需要看起来像这样

CATEGORY    PRODUCT
Database    Oracle
Database    MS SQL Server
Database    DB2
Language    C
Language    Java
Language    Python

我查看了几个不同的 CSV 拆分选项。我不能使用 DBMS_Utility.comma_to_Table 函数,因为它对特殊字符或以数字开头有限制。我找到了一个不错的 TABLE 函数,它可以将字符串转换为单独的行,称为 f_convert。这个函数在 StackOverflow 上大约在页面 here 的 1/3 处。

因为这是一个表函数,所以它被这样调用......并且会像预期的那样给我 3 行。

SELECT * FROM TABLE(f_convert('Oracle, MS SQL Server, DB2'));

如何处理这个 TABLE 函数,因为它是一个“列函数”?虽然这是完全不正确的 SQL,但我正在寻找类似的东西

with t1 as (select CATEGORY, PRODUCT from ... )
select CATEGORY from T1, TABLE(f_convert(PRODUCT) as PRODUCT from t1;

任何帮助表示赞赏...

【问题讨论】:

标签: sql oracle csv


【解决方案1】:

使用 connect by 来“循环”列表中以逗号为分隔符的元素。 regexp_substr 获取列表元素(正则表达式允许 NULL 列表元素),并且前面的子句保持类别直接。

with t1(category, product) as (
  select 'Database', 'Oracle, MS SQL Server, DB2' from dual union all
  select 'Language', 'C, Java, Python' from dual
)
select category, 
       regexp_substr(product, '(.*?)(, |$)', 1, level, NULL, 1) product
from t1
connect by level <= regexp_count(product, ', ')+1   
  and prior category = category
  and prior sys_guid() is not null; 


CATEGORY PRODUCT
-------- --------------------------
Database Oracle
Database MS SQL Server
Database DB2
Language C
Language Java
Language Python

6 rows selected.

SQL>

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 2021-05-16
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多