使用regexp_split_to_table时出错(Amazon Redshift)

时间:2015-03-10 22:11:47

标签: postgresql amazon-redshift set-returning-functions

我有同样的问题:
 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的例子。官方文档不会在他们的快速棕色狐狸中解释它......"示例

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

编辑:我正在使用PostgreSQL 8.0.2。

支持unfst()和regexp_split_to_table()

1 个答案:

答案 0 :(得分:10)

A1

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

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) <> ''
    
  3. VOILÀ。