Sql 从所有行中获取唯一值的单个文本值

Sql 从所有行中获取唯一值的单个文本值,sql,postgresql,Sql,Postgresql,假设我有以下行: 第1行苹果、西瓜、菠萝 第2行苹果、菠萝、橘子 第3行apple,blueberry 我想创建一个文本值,从所有行中获取唯一的值 我们如何处理查询 预期结果: 苹果、西瓜、菠萝、橘子、蓝莓您可以使用以下函数将行值按“,”进行拆分 CREATE FUNCTION [dbo].[ConvertToTable] ( @delimiter char(1), @string nvarchar(MAX) ) RETURNS @Values TABLE

假设我有以下行:

第1行
苹果、西瓜、菠萝

第2行<代码>苹果、菠萝、橘子

第3行
apple,blueberry

我想创建一个文本值,从所有行中获取唯一的值

我们如何处理查询

预期结果:


苹果、西瓜、菠萝、橘子、蓝莓
您可以使用以下函数将行值按“
”进行拆分

CREATE FUNCTION [dbo].[ConvertToTable]
    (
      @delimiter char(1),
      @string nvarchar(MAX)
    )
RETURNS @Values TABLE ( VALUE NVARCHAR(MAX) )
AS BEGIN
    SET @string = @string + @delimiter ;

    WITH    Nbrs_3 ( n ) AS ( SELECT   1 UNION SELECT   0 ) ,
            Nbrs_2 ( n ) AS ( SELECT   1 FROM     Nbrs_3 n1 CROSS JOIN Nbrs_3 n2 ) ,
            Nbrs_1 ( n ) AS ( SELECT   1 FROM     Nbrs_2 n1 CROSS JOIN Nbrs_2 n2 ) ,
            Nbrs_0 ( n ) AS ( SELECT   1 FROM     Nbrs_1 n1 CROSS JOIN Nbrs_1 n2 ) ,
            Nbrs ( n ) AS ( SELECT   1 FROM     Nbrs_0 n1 CROSS JOIN Nbrs_0 n2 )
       INSERT @Values ( [VALUE] )
        SELECT  SUBSTRING(@string, n + 1, CHARINDEX(@delimiter, @string, n + 1) - n - 1)
        FROM    ( SELECT    0 AS 'n' UNION ALL
                  SELECT TOP ( LEN(@string) - 1 ) ROW_NUMBER() OVER ( ORDER BY n ) AS 'n' FROM      Nbrs
                ) x
        WHERE   SUBSTRING(@string, n, 1) = @delimiter
                OR n = 0

    RETURN 
   END
并使用以下代码获得结果

DECLARE @unique_value NVARCHAR(MAX)

WITH cte AS (
SELECT 1 AS id, 'apple,watermelon,pineaple' AS String
UNION
SELECT 2 ,'apple,pineaple,orange'
UNION
SELECT 3 ,'apple,blue berry'

)

SELECT @unique_value= COALESCE(@unique_value+',','')+[VALUE] FROM [cte]
CROSS APPLY [dbo].[ConvertToTable](',',[String]) AS CTT
GROUP BY [VALUE]

SELECT @unique_value
更新:我没有注意到这是关于postgresql的。我已经给出了MSSQL的答案,如果你能在postgresql中也这样做的话。此方法将帮助您..

尝试以下方法:

select array_agg(val) from (
  select distinct unnest(string_to_array(my_column, ',')) val from my_table) x
正在发生的事情的细目:

  • string\u to\u array()
    使用指定的分隔符将字符串拆分为真数组
  • unnest()
    将数组转换为单独的行-每个元素一行
  • distinct
    删除重复行
  • array\u agg()
    将所有行合并到一个CSV字符串中(通常使用
    group by
    子句,但此处不需要,因为只有一个组)
试试这个:

SELECT ARRAY(SELECT distinct    regexp_split_to_table(myTable.columns, E',') AS split_columns FROM myTable);

第1行有三列吗?只有一列的值用逗号分隔?什么版本的postgresql?@JW웃 用逗号分隔的一列。我们使用PostgreSQL 8.4