我有一个表格,需要拆分并插入新表格。列的名称为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, USA
和Chicago, IL, USA
字符串。
现在我对如何再次拆分这些字符串然后插入它们感到困惑。由于有两个逗号分隔的字符串,使用string_to_array
再次起作用吗?它似乎在Sqlfiddle中不起作用。
注意:我现在正在使用Sqlfiddle,因为我目前无法访问我的Redshift表。
这适用于Redshift,遗憾的是它仍在使用PostGresql 8.0.2,因此没有unnest
函数
答案 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;