使用 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 中创建 组 行:
这个解决方法应该可以做到:
创建一个 table 的数字,行数至少与列中的水果一样多。如果您将继续使用它,则可以是临时的或永久的。假设我们从来没有超过 9 个:
CREATE TEMP TABLE nr9(i int);
INSERT INTO nr9(i) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9);
加入号码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) <> ''
瞧瞧。
我也有同样的问题:
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 中创建 组 行:
这个解决方法应该可以做到:
创建一个 table 的数字,行数至少与列中的水果一样多。如果您将继续使用它,则可以是临时的或永久的。假设我们从来没有超过 9 个:
CREATE TEMP TABLE nr9(i int); INSERT INTO nr9(i) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9);
加入号码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) <> ''
瞧瞧。