从逗号分隔的字符串中删除重复项 (Amazon Redshift)

Posted

技术标签:

【中文标题】从逗号分隔的字符串中删除重复项 (Amazon Redshift)【英文标题】:remove duplicates from comma separated string (Amazon Redshift) 【发布时间】:2016-10-07 04:51:15 【问题描述】:

我正在使用 Amazon Redshift。

我在该字符串中有一个列存储为逗号分隔,如Private, Private, Private, Private, Private, Private, United Healthcare。我想使用query 从中删除重复项,因此结果应该是Private, United Healthcare。我显然从 *** 中找到了一些解决方案,并且知道使用正则表达式是可能的。

因此,我尝试使用:

SELECT  regexp_replace('Private, Private, Private, Private, Private, Private, United Healthcare', '([^,]+)(,\1)+', '\1') AS insurances; 

SELECT  regexp_replace('Private, Private, Private, Private, Private, Private, United Healthcare', '([^,]+)(,\1)+', '\g') AS insurances; 

还有一些其他的正则表达式,但似乎不起作用。有什么解决办法吗?

【问题讨论】:

是 Postgres 还是 Redshift? Redshift 所基于的 Postgris 版本太旧了,以至于无法与最新的 Postgres 相比。 它是Redshift,但我认为它使用的是postgrey数据库。 这是两个不同的东西。 Amazon Redshift 基于非常旧的 Postgres 版本。它是 Redshift Postgres - 但不是两者兼而有之,建议的解决方案 regexp_split_to_table 对您不起作用这一事实就是一个迹象。 嗯..好的。在这种情况下我现在该怎么办?顺便感谢您的回复。 Amazon Redshift postgrey sql 中不支持的函数:docs.aws.amazon.com/redshift/latest/dg/… 【参考方案1】:

这是一个用于 Amazon Redshift 的用户定义函数 (UDF)

CREATE FUNCTION f_uniquify (s text)
  RETURNS text
IMMUTABLE
AS $$
  -- Split string by comma-space, remove duplicates, convert back to comma-separated
  return ', '.join(set(s.split(', ')))
$$ LANGUAGE plpythonu;

测试它:

select f_uniquify('Private, Private, Private, Private, Private, Private, United Healthcare');

返回:

United Healthcare, Private

如果返回值的顺序很重要,那么它需要一些更具体的代码。

【讨论】:

【参考方案2】:

试试这个方法,

SELECT  array_agg(DISTINCT insurances) 
FROM (SELECT  regexp_split_to_table('Private, Private, Private, Private, Private, Private, United Healthcare'
              , ',\s+') AS insurances) x;

另一种方式

SELECT DISTINCT UNNEST(regexp_split_to_array('Private, Private, Private, Private, Private, Private, United Healthcare', ',\s+')) AS insurances;

检查http://docs.aws.amazon.com/redshift/latest/dg/String_functions_header.html 两者都会因红移而失败,这些都不会将text 转换为text[]

【讨论】:

[Amazon](500310) 无效操作:函数 regexp_split_to_table("unknown", "unknown") 不存在; docs.aws.amazon.com/redshift/latest/dg/…。 Amazon redshift 上的 postgrey sql 不支持函数 regexp_split_to_array @Dev 是的,我在答案中提到了它,arrays aren't supported,我认为 regexp 不会帮助你。尝试使用 create function 作为 kadalamittai 假设【参考方案3】:

另一种选择是尝试 Python UDF。简单的 Python 函数对字符串进行重复数据删除并返回正确的版本。

【讨论】:

以上是关于从逗号分隔的字符串中删除重复项 (Amazon Redshift)的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式从逗号分隔列表中删除重复项 [重复]

如何通过 Oracle 中的 regexp_replace 从逗号分隔列表中删除重复项?

如何通过 Oracle regexp_replace 中的正则表达式从逗号分隔列表中删除重复项? [复制]

PL/SQL 逗号分隔列表;删除重复并放入数组

从 Boost::Tokenizer 中删除重复项?

Excel 是不是可以识别单元格中以逗号分隔的数字模式并删除该模式的重复项?