我有一个查询,它返回一组包含字母A
、E
、I
和L
组合的行。这种组合是用于Alterar
、Excluir
、Incluir
和Listar
的葡萄牙语助记符。列值可以在A
,AE
,AEL
,AELI
之间变化。。。L
,LI
,LIA
,LIAE
。
在下面的例子中,我希望能够得到一个唯一的字符串,并删除所有重复的字母。因此结果将是AELI
,所有行的合并。
我的第一次尝试是使用函数array_to_string
和array_agg
的组合。
select array_to_string(array_agg(colmn), '') from mytable;
然后我使用
regexp_matches
函数只匹配同一个字母的一个字符,但没有成功,因为返回了AELA
。select regexp_matches('AELAEILI', '[?AEIL][?AEIL][?AEIL][?AEIL]');
Here上面解释的例子。
注意
这里解释的那个问题是一条很好的sql指令。这是我模拟真实问题的努力。
最佳答案
我认为这可以通过使用regexp_split_to_table
postgresql函数来实现。
从文档中:
使用POSIX正则表达式作为分隔符拆分字符串。见
第9.7.3节了解更多信息。
所以,如果有以下数据:
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;