我有以下表数据..表名是类别
| 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
是表名。 ID
和CATEGORY
是列名
它可以成功地将所有逗号分隔的值作为单独的行获取,但是它不会过滤重复的元素,因此我的新临时表split_categori
由重复的记录行组成。
我如何能够过滤这些重复记录?有没有办法使用查询来做到这一点,还是我应该依赖于ResultSet?
答案 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