Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon redshift 使用regexp\u拆分到\u表时出错(Amazon红移)_Amazon Redshift_Set Returning Functions - Fatal编程技术网

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) <> ''