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)
我得到以下内容:
Run Code Online (Sandbox Code Playgroud)ERROR: type "e" does not exist
Q1.怎么E办?我看到一些E不使用的例子.官方文档没有在他们的"快速棕色狐狸......"中解释它.
Q2.我该如何使用'|' 作为我查询的分隔符?
编辑:我正在使用PostgreSQL 8.0.2.unfst()和regexp_split_to_table()都不受支持.
Erw*_*ter 10
E是Posix样式转义字符串的前缀.现代Postgres通常不需要这个.如果要解释字符串中的特殊字符,请仅添加前缀.像E'\n' for a newline char.详细信息和文档链接:
E在您的查询中是无意义的噪音,但它应该仍然有效.我担心你回答的答案不是很好.
应该按原样工作.但更好的没有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)
细节:
它只实现了手册中记录的一组简化功能.特别是,没有表函数,包括基本函数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);
Run Code Online (Sandbox Code Playgroud)加入数字表和使用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 次 |
| 最近记录: |