从逗号分隔的字符串中删除重复项 (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 从逗号分隔列表中删除重复项?