Sql 使用逗号分隔的值从特定列获取所有不同的值

Sql 使用逗号分隔的值从特定列获取所有不同的值,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我正在创建一个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与列中的每一行相比给出不同的值,但在上述情况下,我们如何才能做到这一

我正在创建一个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万行。还有别的选择吗

您可以使用
regexp\u replace
删除重复项并将结果与
listag

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

您可以使用
regexp\u replace
删除重复项,并将结果与
listag

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

回答


使用常规方法将单个字符串拆分为不同的行,然后连接。唯一的问题是连接的字符串不应该超过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
;
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 |
查询1

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
;
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 |

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
;
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 |

使用常规方法将单个字符串拆分为不同的行,然后连接。唯一的问题是连接的字符串不应该超过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
;
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 |
查询1

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
;
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 |

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
;
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 |


我删除了不兼容的数据库标记。请仅标记您真正使用的数据库。谢谢@GordonLinoff@a_horse_with_no_name甲骨文11g。将在问题中更新。逗号分隔的项目。会给你带来很多麻烦…它们总是数字还是字符串?我删除了不兼容的数据库标签。请仅标记您真正使用的数据库。谢谢@GordonLinoff@a_horse_with_no_name甲骨文11g。将在问题中更新。逗号分隔的项目。这会给您带来很多麻烦…它们总是数字还是字符串?问题是它们使用的是Oracle 11g。此解决方案在Oracle上不起作用。您只需进行快速搜索,以找到如何将其转换为Oracle:问题表明他们正在使用Oracle 11g。此解决方案在Oracle上不起作用。您只需进行快速搜索,以找到如何将其转换为Oracle:这正是我想要的,但由于我有更多的结果(超过19k个结果),我认为这需要花费太多时间。有没有其他更快的解决方案@考希克Nayak@test帐户:更好的解决方案是,通过遵循规范化规则,更改表/架构设计,并将值存储为具有适当键的行。这正是我想要的,但由于我有更多的结果(超过19k个结果),我认为这需要太多时间。有没有其他更快的解决方案@考希克Nayak@test帐户:更好的解决方案是,通过遵循规范化规则,更改表/模式设计,并使用适当的键将值存储为行。