删除 PostgreSQL 8.3 上一组行中的重复字母

Removing repeated letters in a set of rows on PostgreSQL 8.3

我有一个查询 returns 一组由字母 AEIL 组合而成的行。该组合是 AlterarExcluirIncluirListar 的葡萄牙语助记符。列值可以在 AAEAELAELI... LLILIA 之间变化LIAE.

在下面的示例中,我希望能够得到一个唯一的字符串,并删除所有重复的字母。所以结果将是 AELI,所有行的合并。

我的第一次尝试是使用函数 array_to_stringarray_agg 的组合。

select array_to_string(array_agg(colmn), '') from mytable;

然后我用regexp_matches函数只匹配同一个字母的一个字符,但是没有成功,因为返回了AELA

select regexp_matches('AELAEILI', '[?AEIL][?AEIL][?AEIL][?AEIL]');

Here 上面解释的例子。


备注

这里解释的问题是一个很好的 sql 说明。这个 sqlfiddle 是我模拟真实问题的努力。

我认为这可以通过使用regexp_split_to_table postgresql 函数来实现。

来自文档:

Split string using a POSIX regular expression as the delimiter. See Section 9.7.3 for more information.

所以,如果有如下数据:

CREATE TABLE example_table (col TEXT);

INSERT INTO example_table(col) VALUES
  ('AEL'),
  ('A'),
  ('E'),
  ('I'),
  ('L'),
  ('LI');

查询结果SELECT regexp_split_to_table(col, '') as col

将是

col
A
E
L
A
E
I
L
L
I

像这样拆分单词后,通过添加 DISTINCT 语句过滤重复项非常简单:

SELECT DISTINCT(regexp_split_to_table(col, '')) as col
  FROM example_table

此查询的结果将是

col
A
E
I
L

最后,我们可以使用以下代码将结果行转换为单个字符串:

SELECT array_to_string(array_agg(col),'') FROM (
  SELECT DISTINCT(regexp_split_to_table(col, '')) as col
  FROM example_table
) temp_table;