Oracle 12cR1 - 我将一个复杂的业务流程放入查询中。一般来说,这个过程将是
with t1 as (select CATEGORY, PRODUCT from ... )
select <some manipulation> from t1;
t1 -又名第一行的输出 - 将如下所示:
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。此功能是在计算器上约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;
任何帮助表示赞赏...
使用 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>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句