我有一个这样的清单:
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
答案 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");