在oracle 11g中拆分多行中的行并在jsp中获取

时间:2014-02-18 10:19:54

标签: sql oracle

表格如下:

+------------+--------------+
| product id | Rates        |
+------------+--------------+
| 108        | 10, 20, 30   |
+------------+--------------+
| 109        | 10,30        |
+------------+--------------+

我想创建以下内容:

+------------+--------------+
| Name       | Rates        |
+------------+--------------+
| 108        | 10           |
+------------+--------------+
|            | 20           |
+------------+--------------+
|            | 30           |
+------------+--------------+

我想在oracle 11g中使用这个,我在jsp中获取行。

2 个答案:

答案 0 :(得分:2)

假设该表名为product_rate,则查询可能会得到答案:

SELECT CASE
          WHEN LEVEL = 1 THEN product_id ELSE NULL END AS Name,
        regexp_substr(Rates, '[^,]+', 1, LEVEL) Rates
   FROM product_rate
 CONNECT BY LEVEL <= length(regexp_replace(Rates, '[^,]+')) + 1;

Sqlfiddle demo

答案 1 :(得分:1)

尝试使用此查询:

WITH tab(product_id, Rates)  AS
(SELECT  108, '10, 20, 30' FROM dual UNION ALL 
 SELECT  109, '10,30'      FROM dual )
-------
--End of data
-------
SELECT CASE WHEN LEVEL = 1 THEN product_id ELSE NULL END AS product_id, 
       regexp_substr(rates, '[^,]+', 1, LEVEL) rates
  FROM TAB
 CONNECT BY regexp_substr(rates, '[^,]+', 1, LEVEL) IS NOT NULL
   AND PRIOR rates = rates
   and prior sys_guid() is not null;

输出:

| PRODUCT_ID | RATES |
|------------|-------|
|        108 |    10 |
|     (null) |    20 |
|     (null) |    30 |
|        109 |    10 |
|     (null) |    30 |