如何在逗号分隔的字符串行中找到不同的元素?

Posted

技术标签:

【中文标题】如何在逗号分隔的字符串行中找到不同的元素?【英文标题】:How to find distinct elements in a comma seperated line of string? 【发布时间】:2019-06-05 07:51:02 【问题描述】:

我喜欢找到不同的元素并将它们排列在一行字符串中,使用标准 SQL(BigQuery) 以逗号分隔。

我已经有一个类似的字符串:

B,A,A,D,C,B

我喜欢生成:

A,B,C,D

我尝试过使用 STRING_AGG 函数。

SELECT STRING_AGG(DISTINCT split(str,","), "," ORDER BY str ASC )  AS string_agg
FROM  UNNEST ( [(select f0_ from temp3 )]) AS str

我得到错误:

"参数的聚合函数 STRING_AGG 没有匹配的签名 类型:数组、字符串”

任何关于使用其他功能或改变结构的建议。

【问题讨论】:

【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
CREATE TEMP FUNCTION STRING_DEDUP(str STRING) AS (
  (SELECT STRING_AGG(item ORDER BY item) FROM (
    SELECT DISTINCT item FROM UNNEST(SPLIT(str)) item 
  ))  
);
SELECT 
  STRING_DEDUP(str) `string_agg`
FROM `project.dataset.table`  

你可以像下面的例子一样使用虚拟数据测试,玩上面的例子

#standardSQL
CREATE TEMP FUNCTION STRING_DEDUP(str STRING) AS (
  (SELECT STRING_AGG(item ORDER BY item) FROM (
    SELECT DISTINCT item FROM UNNEST(SPLIT(str)) item 
  ))  
);
WITH `project.dataset.table` AS (
  SELECT 'B,A,A,D,C,B' str UNION ALL
  SELECT 'X,X,Z,Y,Y'
)
SELECT 
  STRING_DEDUP(str) `string_agg`
FROM `project.dataset.table`   

结果

Row string_agg   
1   A,B,C,D  
2   X,Y,Z    

【讨论】:

【参考方案2】:

使用split 函数是个好主意。它返回一个字符串数组,您可以对其进行排序和删除重复项。最后,如果你想要一个字符串输出,你可以使用ARRAY_TOSTRING 函数。

总而言之,运行这个查询:

SELECT ARRAY_TO_STRING(
    ARRAY(SELECT DISTINCT x FROM UNNEST(split('b,a,a,b,d,c')) AS x ORDER BY x),
    ','
)

给出想要的结果。

【讨论】:

以上是关于如何在逗号分隔的字符串行中找到不同的元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中计算逗号分隔列表中的字符串项

如何在未绑定的 xml 结构中生成逗号分隔的字符串

如何拆分逗号分隔的字符串?

如何在存储过程中拆分逗号分隔的字符串?

db2 对字符串进行分隔(分隔符为逗号),并计算分隔得到的数组的长度,不写自定义函数,如何做到?

提取用逗号分隔的字符串部分