Erwin Brands..
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;
对于简单的分隔符,您不需要昂贵的正则表达式.这通常更快:
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;
细节:
亚马逊Redshift不是Postgres
它只实现了手册中记录的一组简化功能.特别是,没有表函数,包括基本函数unnest(),generate_series()或regexp_split_to_table()使用其"计算节点"(访问任何表)时.
您应该使用标准化的表格布局(每行一个水果的额外表格).
或者这里有一些在Redshift中创建一组行的选项:
此解决方法应该这样做:
创建一个数字表,至少与列中的水果一样多.临时性或永久性的,如果你继续使用它.假设我们从不超过9:
CREATE TEMP TABLE nr9(i int);
INSERT INTO nr9(i) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9);
加入数字表和使用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) <> ''
瞧.