使用 regexp_split_to_table 时出错 (Amazon Redshift)

Error while using regexp_split_to_table (Amazon Redshift)

我也有同样的问题:
Splitting a comma-separated field in Postgresql and doing a UNION ALL on all the resulting tables
只是我的 'fruits' 列由“|”分隔。当我尝试时:

SELECT 
    yourTable.ID, 
    regexp_split_to_table(yourTable.fruits, E'|') AS split_fruits
FROM yourTable

我得到以下信息:

ERROR: type "e" does not exist

Q1。 E 有什么作用?我看到一些未使用 E 的示例。官方文档没有在他们的 "quick brown fox..." 示例中解释它。

Q2。我如何使用“|”作为我查询的分隔符?

编辑:我使用的是 PostgreSQL 8.0.2。 unnest() 和 regexp_split_to_table() 均不受支持。

A1

E 是 Posix 风格转义字符串的前缀。在现代 Postgres 中你通常不需要这个。只有在你想解释字符串中的特殊字符时才在前面加上它。喜欢E'\n' for a newline char.详细信息和文档链接:

  • Insert text with single quotes in PostgreSQL
  • SQL select where column begins with \

E 在您的查询中是毫无意义的噪音,但它应该仍然有效。 The answer you are linking to恐怕不太好。

A2

应该可以正常工作。但没有 E.

更好
SELECT id, regexp_split_to_table(fruits, '|') AS split_fruits
FROM   tbl;

对于简单的分隔符,您不需要昂贵的正则表达式。这通常更快:

SELECT id, unnest(string_to_array(fruits, '|')) AS split_fruits
FROM   tbl;

在 Postgres 9.3+ 中,您宁愿使用 LATERAL 连接来设置返回函数:

SELECT t.id, f.split_fruits
FROM   tbl t
LEFT   JOIN LATERAL unnest(string_to_array(fruits, '|')) AS f(split_fruits)
                                                                   ON true;

详情:

  • PostgreSQL unnest() with element number

Amazon Redshift 不是 Postgres

它只实现了documented in its manual 的一组精简功能。特别是,有 no table 功能,包括基本功能 unnest()generate_series()regexp_split_to_table() 使用其 "compute nodes"(访问任何 table)。

您应该首先使用 标准化 table 布局 (额外 table 每行一个水果)。

或者这里有一些选项可以在 Redshift 中创建 行:

这个解决方法应该可以做到:

  1. 创建一个 table 的数字,行数至少与列中的水果一样多。如果您将继续使用它,则可以是临时的或永久的。假设我们从来没有超过 9 个:

    CREATE TEMP TABLE nr9(i int);
    INSERT INTO nr9(i) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9);
    
  2. 加入号码table并使用split_part(),即actually implemented in Redshift:

    SELECT *, split_part(t.fruits, '|', n.i) As fruit
    FROM   nr9 n
    JOIN   tbl t ON split_part(t.fruits, '|', n.i) <> ''
    

瞧瞧。