【问题标题】:Splitting string and sorting in postgresql在 postgresql 中拆分字符串和排序
【发布时间】:2018-05-26 15:01:36
【问题描述】:

我在 postgresql 中有一个表,其文本列的值如下:

column
-----------
CA;TB;BA;CB
XA;VA
GA;BA;LA

我想对每个值中的元素进行排序,以便查询结果如下:

column
-----------
BA;CA;CB;TB
VA;XA
BA;GA;LA

我尝试过 string_to_arrayregexp_split_to_arrayarray_agg,但我似乎没有接近它。

谢谢。

【问题讨论】:

    标签: sql arrays postgresql sorting split


    【解决方案1】:

    我希望这很容易理解:

    WITH tab AS (
        SELECT
            *
        FROM
            unnest(ARRAY[
                'CA;TB;BA;CB', 
                'XA;VA', 
                'GA;BA;LA']) AS txt
    )
    SELECT
        string_agg(val, ';')
    FROM (
        SELECT
            txt,
            regexp_split_to_table(txt, ';') AS val
        FROM
            tab
        ORDER BY 
            val
    ) AS sub
    GROUP BY
        txt;
    

    首先,我将值拆分为行 (regexp_split_to_table) 并进行排序。然后group by原始值并再次加入string_agg

    输出:

    BA;CA;CB;TB
    BA;GA;LA
    VA;XA
    

    【讨论】:

      【解决方案2】:

      我可能过于复杂了:

      t=# with a(c)as (values('CA;TB;BA;CB')
      ,('XA;VA')
      ,('GA;BA;LA'))
      , w as (select string_agg(v,';') over (partition by c order by v), row_number() over (partition by c),count(1) over(partition by c) from a,unnest(string_to_array(a.c,';')) v)
      select * from w where row_number = count;
       string_agg  | row_number | count
      -------------+------------+-------
       BA;CA;CB;TB |          4 |     4
       BA;GA;LA    |          3 |     3
       VA;XA       |          2 |     2
      (3 rows)
      

      这里有一点丑陋的黑客:

      with a(c)as (values
      ('CA;TB;BA;CB')
      ,('XA;VA')
      ,('GA;BA;LA'))
      select translate(array_agg(v order by v)::text,',{}',';') from a, unnest(string_to_array(a.c,';')) v group by c;
        translate
      -------------
       BA;CA;CB;TB
       BA;GA;LA
       VA;XA
      (3 rows)
      

      【讨论】:

        猜你喜欢
        • 2014-02-18
        • 1970-01-01
        • 2017-11-23
        • 2018-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多