从逗号分隔值特定列中获取所有不同值

问题描述 投票:0回答:3

我的工作,以创建一个SQL查询。我试过多个环节计算器内和GOOGLE了它,但不能喜欢一个解决方案。我有以下:

column_name
1,2,3,string1
3,1,string2
4,5,string3
2,4,string1

所以我想下面的输出如下:

1,2,3,4,5,string1,string2,string3,string4

基本上,我想从一个逗号所有的独特的价值观分离column.I知道不同给出了比列各行不同的瓦莱斯,但如何才能做到这一点在上述情况时。

注:我使用的是Oracle 11g数据库。 Kaushik的答案看起来SQL提琴手好。但它不是我的工作,因为我有超过20K行。有什么方法吗?

sql oracle oracle11g
3个回答
2
投票

拆分各个串为不同行使用常规方法,然后串联。唯一的问题是,连接字符串不得超过4000个字符

SQL Fiddle

的Oracle 11g R2架构设置:

CREATE TABLE yourtable
    (column_name varchar2(13))
;

INSERT ALL 
    INTO yourtable (column_name)
         VALUES ('1,2,3,string1')
    INTO yourtable (column_name)
         VALUES ('3,1,string2')
    INTO yourtable (column_name)
         VALUES ('4,5,string3')
    INTO yourtable (column_name)
         VALUES ('2,4,string1')
SELECT * FROM dual
;

问题1:

select LISTAGG(val,',') WITHIN GROUP ( ORDER BY val ) as final
FROM
(
select distinct  trim(regexp_substr(column_name,'[^,]+', 1, level) ) as val 
  from yourtable
   connect by regexp_substr(column_name, '[^,]+', 1, level) is not null
  ORDER BY val
 )

Results

|                             FINAL |
|-----------------------------------|
| 1,2,3,4,5,string1,string2,string3 |

0
投票

您可以使用regexp_replace去除重复和连接具有listagg结果

SELECT 
       RTRIM(
         REGEXP_REPLACE(
           (listagg(Num,',') WITHIN GROUP (ORDER BY Num) OVER ()), 
           '([^,]*)(,\1)+($|,)', 
           '\1'),
         ',') Nums 
FROM Table;

-1
投票

回答this question

create table ##Testdata(SomeID int, OtherId varchar(100), Data varchar(max))
insert ##Testdata select 1, '1,2,3', '1,2,3'
insert ##Testdata select 2, '3,1', '3,1'
insert ##Testdata select 3, '4,5', '4,5'
insert ##Testdata select 4, '2,4', '2,4'

;with tmp(SomeID, OtherID, DataItem, Data) as (
select SomeID, OtherID, LEFT(Data, CHARINDEX(',',Data+',')-1),
    STUFF(Data, 1, CHARINDEX(',',Data+','), '')
from ##Testdata
union all
select SomeID, OtherID, LEFT(Data, CHARINDEX(',',Data+',')-1),
    STUFF(Data, 1, CHARINDEX(',',Data+','), '')
from tmp
where Data > ''
)
select SomeID, OtherID, DataItem
from tmp
order by SomeID
-- OPTION (maxrecursion 0)
-- normally recursion is limited to 100. If you know you have very long
-- strings, uncomment the option
© www.soinside.com 2019 - 2024. All rights reserved.