使用regexp_split_to_table时出错(Amazon Redshift)

Rei*_*e45 6 postgresql amazon-redshift set-returning-functions

我有同样的问题:
在Postgresql中拆分逗号分隔的字段并在所有结果表上执行UNION ALL
只是我的'fruits'列由'|'分隔.当我尝试:

SELECT 
    yourTable.ID, 
    regexp_split_to_table(yourTable.fruits, E'|') AS split_fruits
FROM yourTable
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

ERROR: type "e" does not exist
Run Code Online (Sandbox Code Playgroud)

Q1.怎么E办?我看到一些E不使用的例子.官方文档没有在他们的"快速棕色狐狸......"中解释它.

Q2.我该如何使用'|' 作为我查询的分隔符?

编辑:我正在使用PostgreSQL 8.0.2.unfst()和regexp_split_to_table()都不受支持.

Erw*_*ter 10

A1

E是Posix样式转义字符串的前缀.现代Postgres通常不需要这个.如果要解释字符串中的特殊字符,请仅添加前缀.像E'\n' for a newline char.详细信息和文档链接:

E在您的查询中是无意义的噪音,但它应该仍然有效.我担心你回答的答案不是很好.

A2

应该按原样工作.但更好的没有E.

SELECT id, regexp_split_to_table(fruits, '|') AS split_fruits
FROM   tbl;
Run Code Online (Sandbox Code Playgroud)

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

SELECT id, unnest(string_to_array(fruits, '|')) AS split_fruits
FROM   tbl;
Run Code Online (Sandbox Code Playgroud)

在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;
Run Code Online (Sandbox Code Playgroud)

细节:

亚马逊Redshift不是Postgres

它只实现了手册中记录的一组简化功能.特别是,没有表函数,包括基本函数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);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 加入数字表和使用split_part(),实际上是在Redshift中实现的:

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

瞧.


归档时间:

查看次数:

3068 次

最近记录:

10 年,11 月 前