如何使用Postgresql将文本拆分为多个字段?

时间:2015-09-22 15:52:16

标签: postgresql amazon-redshift dimensional-modeling

我有一个表格,需要拆分并插入新表格。列的名称为location,其数据可能类似于Detroit, MI, USA;Chicago, IL, USA或简单为USA

最终,我想将数据插入到一个新的维度表中,如下所示:

City   | State | Country|
Detroit  MI      USA
Chicago  IL      USA
NULL     NULL    USA

我遇到了string_to_array函数,我可以将较大的示例(Detroit, MI, USA; Chicago, IL, USA))拆分为2个Detroit, MI, USAChicago, IL, USA字符串。

现在我对如何再次拆分这些字符串然后插入它们感到困惑。由于有两个逗号分隔的字符串,使用string_to_array再次起作用吗?它似乎在Sqlfiddle中不起作用。

注意:我现在正在使用Sqlfiddle,因为我目前无法访问我的Redshift表。

这适用于Redshift,遗憾的是它仍在使用PostGresql 8.0.2,因此没有unnest函数

1 个答案:

答案 0 :(得分:2)

postgres=# select v[1] as city, v[1] as state, v[2] as country
              from (select string_to_array(unnest(string_to_array(
           'Detroit, MI, USA;Chicago, IL, USA',';')),',')) s(v);
┌─────────┬─────────┬─────────┐
│  city   │  state  │ country │
╞═════════╪═════════╪═════════╡
│ Detroit │ Detroit │  MI     │
│ Chicago │ Chicago │  IL     │
└─────────┴─────────┴─────────┘
(2 rows)

在Postgres上测试过,不确定它是否也适用于Redshift

下一个查询应该适用于每个Postgres

select  v[1] as city, v[1] as state, v[2] as country 
    from (select string_to_array(v, ',') v 
             from unnest(string_to_array(
'Detroit, MI, USA;Chicago, IL, USA',';')) g(v)) s;

它使用旧的PostgreSQL技巧 - 使用派生表。

SELECT v[1], v[2] FROM (SELECT string_to_array('1,2',',')) g(v)

Unnest function:

CREATE OR REPLACE FUNCTION _unnest(anyarray)
RETURNS SETOF anyelement AS '
BEGIN
  FOR i IN array_lower($1,1) .. array_upper($1,1) LOOP
    RETURN NEXT $1[i];
  END LOOP;
  RETURN;
END;
' LANGUAGE plpgsql;