如何以智能方式拆分字符串?

时间:2015-06-11 02:04:12

标签: postgresql

函数string_to_array在没有用撇号分组子字符串的情况下拆分字符串:

# select unnest(string_to_array('one, "two,three"', ','));
 unnest
--------
 one
 "two
 three"
(3 rows)

我希望有一个更聪明的功能,如:

# select unnest(smarter_string_to_array('one, "two,three"', ','));
 unnest
--------
 one
 two,three
(2 rows)

目的。

我知道COPY命令以正确的方式执行,但我在内部需要此功能。 我想解析现有表行的文本表示。例如:

# select * from dataset limit 2;
 id |      name       | state  
----+-----------------+--------
  1 | Smith, Reginald | Canada
  2 | Jones, Susan    | 
(2 rows)

# select dataset::text from dataset limit 2;
           dataset            
------------------------------
 (1,"Smith, Reginald",Canada)
 (2,"Jones, Susan","")
(2 rows)

我想在不同的表的plpgsql函数中动态地执行它。我不能假设表的列数不变,也不能假设列值的格式。

1 个答案:

答案 0 :(得分:1)

有一种很好的方法可以将整个表转换为单列表:

select (json_each_text(row_to_json(t))).value from dataset t;

如果列ID是唯一的,那么

select id, array_agg(value) arr from (
    select row_number() over() rn, id, value from (
        select id, (json_each_text(row_to_json(t))).value from dataset t
        ) alias
    order by id, rn
    ) alias
group by id;

完全满足您的需求。使用row_number()的附加查询是保持列的原始顺序所必需的。