代码之家  ›  专栏  ›  技术社区  ›  Geison Santos

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

  •  0
  • Geison Santos  · 技术社区  · 6 年前

    我有一个查询,它返回一组包含字母组合的行 A , E , I L . 这种组合是葡萄牙的记忆法 Alterar , Excluir , Incluir Listar . 列值可以在 , AE , AEL , AELI L , LI , LIA , LIAE

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

    enter image description here

    我的第一次尝试是使用函数的组合 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指令。这个 sqlfiddle 是我模拟真实问题的努力。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Dimitar Spasovski    6 年前

    我认为这可以通过使用 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;
    
    推荐文章