如何使用 Postgresql 将文本拆分为多个字段?
Posted
技术标签:
【中文标题】如何使用 Postgresql 将文本拆分为多个字段?【英文标题】:How do I split text into multiple fields using Postgresql? 【发布时间】:2015-09-22 15:52:16 【问题描述】:我有一个表,其中有一列需要拆分并插入到新表中。列的名称是 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)
拆分为两个字符串 Detroit, MI, USA
和 Chicago, IL, USA
。
现在我不知道如何再次拆分这些字符串然后插入它们。由于有两个用逗号分隔的字符串,再次使用string_to_array
是否有效?它似乎在 Sqlfiddle 中不起作用。
注意:我现在正在使用 Sqlfiddle,因为我目前无法访问我的 Redshift 表。
这是为 Redshift 准备的,遗憾的是它仍在使用 PostGresql 8.0.2,因此没有 unnest
函数
【问题讨论】:
【参考方案1】: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)
未嵌套函数:
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;
【讨论】:
我不认为这会解决问题,考虑到仅包含美国等国家/地区代码的一级数组的示例。 刚刚意识到Redshift是基于Postgres 8.0的……完全以为是9.0。你知道unnest
的替代品吗?
@RonDunn 实际上,数据可能被标准化为所有条目的 3 级数组
@simplycoding 查看更新的文本 - unnest
的源代码。 8.0 已经很老了,但我希望它应该可以工作。
嘿@Pavel 我正在尝试通过您编写的unnest
函数。当我只是复制+粘贴+执行时,它似乎不起作用。我收到“"$$ BEGIN FOR i IN array_lower($1,1) .. array_upper($1,1) LOOP RETURN NEXT $1[i]
"$$ BEGIN FOR i IN array_lower($1,1) .. array_upper($1,1) LOOP RETURN NEXT $1[i]
或附近未终止的美元引用字符串”的错误消息以上是关于如何使用 Postgresql 将文本拆分为多个字段?的主要内容,如果未能解决你的问题,请参考以下文章