Amazon redshift 使用regexp\u拆分到\u表时出错(Amazon红移)
我的问题与此相同:Amazon redshift 使用regexp\u拆分到\u表时出错(Amazon红移),amazon-redshift,set-returning-functions,Amazon Redshift,Set Returning Functions,我的问题与此相同: 只是我的“水果”列由“|”分隔。当我尝试时: SELECT yourTable.ID, regexp_split_to_table(yourTable.fruits, E'|') AS split_fruits FROM yourTable 我得到以下信息: 问题1。E做什么?我看到了一些不使用E的示例。官方文件没有在他们的“快速棕色狐狸…”例子中解释这一点 问题2。如何使用“|”作为查询的分隔符 编辑:我正在使用PostgreSQL 8.0.2。un
只是我的“水果”列由“|”分隔。当我尝试时:
SELECT
yourTable.ID,
regexp_split_to_table(yourTable.fruits, E'|') AS split_fruits
FROM yourTable
我得到以下信息:
问题1。E
做什么?我看到了一些不使用E
的示例。官方文件没有在他们的“快速棕色狐狸…”例子中解释这一点
问题2。如何使用“|”作为查询的分隔符
编辑:我正在使用PostgreSQL 8.0.2。unnest()和regexp\u split\u to\u table()都不受支持。A1
E
是Posix样式转义字符串的前缀。现代博士后通常不需要这个。仅当要解释字符串中的特殊字符时,才在其前面加上前缀。类似于新行字符的E'\n。
详细信息和文档链接:
E
在您的查询中是毫无意义的噪音,但它应该仍然有效。恐怕不是很好
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+中,您更愿意使用横向连接来实现集合返回功能:
SELECT t.id, f.split_fruits
FROM tbl t
LEFT JOIN LATERAL unnest(string_to_array(fruits, '|')) AS f(split_fruits)
ON true;
详情:
亚马逊红移不是Postgres
它只实现了一组简化的功能。特别是,在使用其“计算节点”(访问任何表)时,没有表函数,包括基本函数unest()
、generate\u series()
或regexp\u split\u to\u table()
首先,您应该使用规范化的表布局(每行一个水果的额外表)
或者,以下是在红移中创建一组行的一些选项:
此解决方案应能:
创建一个数字表,列中至少包含尽可能多的行。临时的或永久的,如果你继续使用它。假设我们从来没有超过9个:
CREATE TEMP TABLE nr9(i int);
INSERT INTO nr9(i) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9);
连接到数字表并使用split\u part()
,即:
SELECT*,将部分(t.fruits,“|”,n.i)拆分为水果
来自nr9 n
在拆分部分(t.F.“|”,n.i)”上加入tbl t
瞧。原来我使用的是8.0.2版。有没有办法在这个版本上执行上述操作?@Reise45:Redshift不是Postgres。它根本不支持表函数。我为红移添加了一个可能的解决方案。是的,不幸的是,我的数据太大,这个函数在红移时太慢。走红移-S3-Python-S3-Redshift路线。
CREATE TEMP TABLE nr9(i int);
INSERT INTO nr9(i) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9);
SELECT *, split_part(t.fruits, '|', n.i) As fruit
FROM nr9 n
JOIN tbl t ON split_part(t.fruits, '|', n.i) <> ''