首先让我说,这种数据库设计是一个非常糟糕的 idea ,损害了正常化规则.一般来说,一栏应该包含一个信息,而不是一堆邮件地址.最好创建一个映射表,其中单独存储一个人的所有邮件地址.
即使上面的改进对你来说是不可能的,不管是什么原因,试着找一个更好的分隔符来标明不同邮件地址之间的"边界".我知道许多人在他们的邮件地址中使用-
,所以我怀疑你会通过这种方式得到你想要的东西.
但不管怎样,这些问题由你来处理.这里有一个选项可以获得你的预期结果:
WITH separatedMailAddresses AS
(SELECT
email,
UNNEST(
STRING_TO_ARRAY(email, '-')
) AS parts
FROM yourtable
GROUP BY email)
SELECT
email,
REPLACE(STRING_AGG(parts, ',')
FILTER (WHERE parts LIKE '%@%'),' ','') AS email_list
FROM separatedMailAddresses
GROUP BY email;
这将产生您在问题中描述的结果.如果不需要,请从第二个查询中删除邮箱列.
试试看here
一些关于那里发生的事情的解释:
UNNEST
和STRING_TO_ARRAY
的组合是众所周知的"变通办法",可以构建SPLIT_PART
函数,而不必提供位置作为参数.SPLIT_PART
函数需要一个字符串、一个分隔符和我们要获取的部分的位置.但您不想只获取某一部分,而是要获取-
之间的所有部分.据我所知,这是不可能的内置函数.
为了从不同的邮件地址创建逗号分隔的列表,我们可以使用STRING_AGG
.但是我们必须删除那些不包含@
的"邮件地址",因为这些字符串不应该出现在结果中.因此,我们有LIKE
的这个条件.
我们现在创建的邮件地址列表可能包含空格(对于您的示例数据,实际上就是这种情况).所以我们用REPLACE
把它们go 掉.