我有同样的问题:
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()答案 0 :(得分:10)
E
是Posix样式转义字符串的前缀。现代Postgres通常不需要这个。如果要解释字符串中的特殊字符,请仅添加前缀。与E'\n' for a newline char.
详细信息和文档链接一样:
E
在您的查询中是无意义的噪音,但它应该仍然有效。我担心The answer you are linking to不是很好。
应该按原样运作。但如果没有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;
详细说明:
它只实现了一组简化的功能documented in its manual。特别是,当使用“计算节点”(访问任何表)时,有没有表函数,包括基本函数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()
,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) <> ''
VOILÀ。