假设 A 表最多 3 个项目,B 表最多 2 个项目,那么您可以使用:
SELECT REGEXP_SUBSTR(a1, '[^;]+', 1, 1) AS col1,
REGEXP_SUBSTR(a2, '[^;]+', 1, 1) AS col2,
REGEXP_SUBSTR(a1, '[^;]+', 1, 2) AS col3,
REGEXP_SUBSTR(a2, '[^;]+', 1, 2) AS col3,
REGEXP_SUBSTR(a1, '[^;]+', 1, 3) AS col4,
REGEXP_SUBSTR(a2, '[^;]+', 1, 3) AS col5,
A3 AS col6,
REGEXP_SUBSTR(b1, '[^;]+', 1, 1) AS col6,
REGEXP_SUBSTR(b2, '[^;]+', 1, 1) AS col7,
REGEXP_SUBSTR(b1, '[^;]+', 1, 2) AS col8,
REGEXP_SUBSTR(b2, '[^;]+', 1, 2) AS col9,
B3 AS col10
FROM your_query;
您的列命名已在输出中复制,但更好的做法是唯一命名列。
其中,对于样本,数据:
CREATE TABLE your_query (A1, A2, A3, B1, B2, B3) AS
SELECT 'a;b;c', '1;2;3', 't', 'x;y', '8;9', 'p' FROM DUAL
输出:
| COL1 |
COL2 |
COL3 |
COL3 |
COL4 |
COL5 |
COL6 |
COL6 |
COL7 |
COL8 |
COL9 |
COL10 |
| a |
1 |
b |
2 |
c |
3 |
t |
x |
8 |
y |
9 |
p |
db小提琴here
如果您有可变数量的列,那么您最好使用任何中间层语言(即 C#、PHP、Java、C++)执行转换,以作为 SQL(不仅仅是 Oracle SQL)访问数据库必须有固定数量的已知列。
可以在 PL/SQL 中使用动态 SQL 以编程方式生成 SQL 语句,然后使用 EXECUTE IMMEDIATE,但我不建议这样做,因为它会很复杂并且可能比在中间层。