gpt4 book ai didi

amazon-redshift - 使用 regexp_split_to_table (Amazon Redshift) 时出错

转载 作者:行者123 更新时间:2023-11-29 11:23:48 30 4
gpt4 key购买 nike

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

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' 换行符一样。详细信息和文档链接:

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;

详细信息:

Amazon Redshift 不是 Postgres

它只实现了一组精简的功能,如 documented in its manual .特别是,没有表函数,包括基本函数unnest()generate_series()regexp_split_to_table() 使用其“计算节点”(访问任何表)时。

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

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

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

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

    CREATE TEMP TABLE nr9(i int);
    INSERT INTO nr9(i) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9);
  2. 加入数表,使用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) <> ''

瞧。

关于amazon-redshift - 使用 regexp_split_to_table (Amazon Redshift) 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28975066/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com