oracle中的Unnest(String_to_array)转换
Unnest(String_to_array) conversion in oracle
我正在将 PostgreSQL 代码的过程结构迁移到 Oracle。对于 PostgreSQL 的 unnest(string_to_array)
?
,Oracle 中是否存在任何替代函数
select a.finalval
from (select unnest(string_to_array(vturs_id, ',')) as finalval)
使用 table 集合表达式,而不是使用定界字符串,而是使用集合或 VARRAY
(如 SYS.ODCINUMBERLIST
):
SELECT COLUMN_VALUE as finalval
FROM TABLE( SYS.ODCINUMBERLIST( 1, 2, 4 ) )
输出:
| FINALVAL |
| -------: |
| 1 |
| 2 |
| 4 |
db<>fiddle here
如果您必须使用定界字符串(不要),那么您可以使用递归子查询分解子句来解析字符串:
WITH test_data ( delimited_string ) AS (
SELECT '1,2,40,-5,72' FROM DUAL
),
bounds ( delimited_string, start_idx, end_idx ) AS (
SELECT delimited_string,
1,
INSTR( delimited_string, ',', 1 )
FROM test_data
UNION ALL
SELECT delimited_string,
end_idx + 1,
INSTR( delimited_string, ',', end_idx + 1 )
FROM bounds
WHERE end_idx > 0
)
SELECT CASE end_idx
WHEN 0
THEN SUBSTR( delimited_string, start_idx )
ELSE SUBSTR( delimited_string, start_idx, end_idx - start_idx )
END AS finalval
FROM bounds;
输出:
| FINALVAL |
| :------- |
| 1 |
| 2 |
| 40 |
| -5 |
| 72 |
db<>fiddle here
我正在将 PostgreSQL 代码的过程结构迁移到 Oracle。对于 PostgreSQL 的 unnest(string_to_array)
?
select a.finalval
from (select unnest(string_to_array(vturs_id, ',')) as finalval)
使用 table 集合表达式,而不是使用定界字符串,而是使用集合或 VARRAY
(如 SYS.ODCINUMBERLIST
):
SELECT COLUMN_VALUE as finalval
FROM TABLE( SYS.ODCINUMBERLIST( 1, 2, 4 ) )
输出:
| FINALVAL | | -------: | | 1 | | 2 | | 4 |
db<>fiddle here
如果您必须使用定界字符串(不要),那么您可以使用递归子查询分解子句来解析字符串:
WITH test_data ( delimited_string ) AS (
SELECT '1,2,40,-5,72' FROM DUAL
),
bounds ( delimited_string, start_idx, end_idx ) AS (
SELECT delimited_string,
1,
INSTR( delimited_string, ',', 1 )
FROM test_data
UNION ALL
SELECT delimited_string,
end_idx + 1,
INSTR( delimited_string, ',', end_idx + 1 )
FROM bounds
WHERE end_idx > 0
)
SELECT CASE end_idx
WHEN 0
THEN SUBSTR( delimited_string, start_idx )
ELSE SUBSTR( delimited_string, start_idx, end_idx - start_idx )
END AS finalval
FROM bounds;
输出:
| FINALVAL | | :------- | | 1 | | 2 | | 40 | | -5 | | 72 |
db<>fiddle here