如何使用 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, USAChicago, 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 将文本拆分为多个字段?的主要内容,如果未能解决你的问题,请参考以下文章

将多个空格从文本文件拆分为数组

如何拆分具有字符串和双精度的输入文本文件?

如何使用 REGEX 将作者拆分为对象或数组 C#?

Pandas Dataframe:如何将一列拆分为多个单热编码列[重复]

PIG 脚本根据特定单词将大型文本文件拆分为多个部分

通过分隔符将列文本拆分为R中的多个不同列