Oracle SQL,我坚持使用listagg查询

时间:2014-12-15 10:06:23

标签: sql oracle

我有一个这样的清单:

cities                           firms
------                         -------
["NEWYORK"]                        1
["CHICAGO"]                        1
["LA"]                             1
["DENVER","VIENNA','LONDON']       2
["TORONTO"]                        2
["WASHINGTON",'VIENNA']            2

我想用oracle sql替换列表,如下所示:

cities                                     firms
------                                    -------
NEWYORK,CHICAGO,LA                           1
NEWYORK,CHICAGO,LA                           1
NEWYORK,CHICAGO,LA                           1
DENVER,VIENNA,LONDON,TORONTO,WASHINGTON      2
DENVER,VIENNA,LONDON,TORONTO,WASHINGTON      2
DENVER,VIENNA,LONDON,TORONTO,WASHINGTON      2

1 个答案:

答案 0 :(得分:1)

类似的东西,也许:

SELECT listagg("city", ',') WITHIN GROUP (ORDER BY "city") "cities",
       "firms"
FROM (
  SELECT DISTINCT REGEXP_SUBSTR("cities", '[^,]+',1, LEVEL) "city",
                  "firms"
  FROM T
  CONNECT BY LEVEL < 5 AND REGEXP_SUBSTR("cities", '[^,]+',1, LEVEL) IS NOT NULL
--                   ^
--          :/ Arbitrary maximum depth...
) V
GROUP BY "firms"

产:

|                                  CITIES | FIRMS |
|-----------------------------------------|-------|
|                      CHICAGO,LA,NEWYORK |     1 |
| DENVER,LONDON,TORONTO,VIENNA,WASHINGTON |     2 |

这是相当粗糙的,可能需要很多更多改进。但这应该会给你一些想法......

我很难理解为什么这可能会有所帮助,但如果您真的需要像原始表中那样重复的记录,那么简单的JOIN将产生所需的输出:

WITH W AS (
     

以上查询

    ) V
    GROUP BY "firms"
  )

SELECT W."cities", "firms" FROM W JOIN T USING("firms");

请参阅http://sqlfiddle.com/#!4/403e9/37