Sql 从xmltable oracle中选择几个字段

Sql 从xmltable oracle中选择几个字段,sql,oracle11g,Sql,Oracle11g,我有一个关于xmltable的查询: WITH sample_data AS( SELECT 10001 ID, '"A","B","C"' str, '"val_a","val_b","val_e"' numf FROM dual UNION ALL SELECT 10002 ID, '"D","E","F"' str, '"val_c","val_a","val_z"' numf FROM dual UNION ALL SELECT 10003 ID, '"C","

我有一个关于
xmltable
的查询:

WITH sample_data AS(

    SELECT 10001 ID, '"A","B","C"' str, '"val_a","val_b","val_e"' numf FROM dual UNION ALL
    SELECT 10002 ID, '"D","E","F"' str, '"val_c","val_a","val_z"' numf FROM dual UNION ALL
    SELECT 10003 ID, '"C","E","G"' str, '"val_q","val_f","val_p"' numf FROM dual
    )

    SELECT id,
           trim(n.getstringval()) str
    FROM sample_data,
         xmltable(str) n
结果我得到:

 --id--|--str---
 10001 |   A
 10001 |   B
 10001 |   C
 10002 |   D
 10002 |   E
 10002 |   F
 10003 |   C
 10003 |   E
 10003 |   G
现在我需要得到这个结果:

 --id--|--str--|--numf--
 10001 |   A   |  val_a
 10001 |   B   |  val_b
 10001 |   C   |  val_e
 10002 |   D   |  val_c
 10002 |   E   |  val_a
 10002 |   F   |  val_z
 10003 |   C   |  val_q
 10003 |   E   |  val_f
 10003 |   G   |  val_p
如何更新查询以获得此结果?

您可以使用:

WITH sample_data AS(
    SELECT 10001 ID, '"A","B","C"' str, '2,3,4' numf FROM dual UNION ALL
    SELECT 10002 ID, '"D","E","F"' str, '5,6,7' numf FROM dual UNION ALL
    SELECT 10003 ID, '"C","E","G"' str, '8,9,10'numf FROM dual
), cte2 AS (
SELECT id,
       trim(n.getstringval()) str,
       NULL AS numf,
       rownum AS r
FROM sample_data, xmltable(str) n
UNION ALL
SELECT id,
       NULL,
       trim(n.getstringval()) numf,
       rownum
FROM sample_data, xmltable(numf) n
)
SELECT MIN(ID) AS ID, MIN(str) AS str, MIN(numf) AS numf
FROM cte2
GROUP BY r
ORDER BY ID, str;

输出:

┌───────┬─────┬──────┐
│  ID   │ STR │ NUMF │
├───────┼─────┼──────┤
│ 10001 │ A   │    2 │
│ 10001 │ B   │    3 │
│ 10001 │ C   │    4 │
│ 10002 │ D   │    5 │
│ 10002 │ E   │    6 │
│ 10002 │ F   │    7 │
│ 10003 │ C   │    8 │
│ 10003 │ E   │    9 │
│ 10003 │ G   │   10 │
└───────┴─────┴──────┘

我的意思是不同的。我需要在最终结果中添加“numf”字段。也许这些数字不是最成功的例子,这是我的错。我会更正这个问题。@Ivanov我不会第三次更新我的答案。请停止“原地”更改您的问题,因为您使现有答案无效。