从`regexp_split_to_table`过滤临时表中的重复记录

时间:2016-10-13 06:21:25

标签: postgresql

我有以下表数据..表名是类别

| ID             | CATEGORY                     | 
+----------------+--------------------------+
| 1              | Apple,Orance-........... | 
| 2              | Apple,Grapes-........... | 
| 3              | Juice,Apple,Cucumber-... |

我试图通过将逗号分隔值解析为单独的行来创建临时表,如下所示

| ID          | split_categori
+-------------+-------------------
| 1           | Apple
| 2           | Orange
| 3           | Grapes
| 4           | Juice
| 5           | Cucumber

我使用以下代码来做到这一点。

SELECT CATEGORI.ID, regexp_split_to_table(CATEGORI.CATEGORY, E',') AS split_categori  FROM CATEGORI;

CATEGORI是表名。 IDCATEGORY是列名

它可以成功地将所有逗号分隔的值作为单独的行获取,但是它不会过滤重复的元素,因此我的新临时表split_categori由重复的记录行组成。

我如何能够过滤这些重复记录?有没有办法使用查询来做到这一点,还是我应该依赖于ResultSet?

1 个答案:

答案 0 :(得分:1)

由于您似乎并不关心您为重复类别选择的ID,因此您可以使用:

select min(c.id) as id, t.name
from categori c
  cross join regexp_split_to_table(c.category, E',') AS t(name) 
group by t.name
order by 1;

请注意,不鼓励在select列表中使用set returns函数,不应再使用,这就是为什么我将regexp_split_to_table()移到from子句中的原因。

但是regexp_split_to_table()是一个非常慢的函数,只有当真正需要拆分正则表达式时才应该使用它。使用string_to_array()可以更多更高效:

select min(c.id) as id, t.name
from categori c
  cross join unnest(string_to_array(c.category, ',')) AS t(name) 
group by t.name
order by 1

以下是一个正在运行的示例:http://rextester.com/YSHT62551