[英]Get distinct values from a column in a single comma separated string in sql?
[英]get all distinct values from a particular column with comma separated values
我正在努力创建一个SQL查询。 我尝试了stackoverflow中的多个链接,并用谷歌搜索,但无法找到解决方案。 我有以下内容:
column_name
1,2,3,string1
3,1,string2
4,5,string3
2,4,string1
所以我想要下面的输出:
1,2,3,4,5,string1,string2,string3,string4
基本上我想从逗号分隔的列中获取所有唯一值。我知道与列中的每一行相比,distinct给出了不同的值,但是在上述情况下我们该怎么做。
注意:我正在使用Oracle 11g数据库。 Kaushik的答案在SQL Fiddler中看起来不错。 但它对我不起作用,因为我有超过2万行。 还有其他选择吗?
使用常规方法将各个字符串分成不同的行,然后进行连接。 唯一的问题是串联的字符串不应超过4000个字符
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
)
结果 :
| FINAL |
|-----------------------------------|
| 1,2,3,4,5,string1,string2,string3 |
您可以使用regexp_replace
删除重复项并将结果与listagg
连接
SELECT
RTRIM(
REGEXP_REPLACE(
(listagg(Num,',') WITHIN GROUP (ORDER BY Num) OVER ()),
'([^,]*)(,\1)+($|,)',
'\1'),
',') Nums
FROM Table;
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.