2016-10-13 46 views
0

我有如下表DATAS。表名是過濾從臨時表從`regexp_split_to_table`重複記錄

| 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嗎?

+0

如果您有不同的ID相同categori,你要選擇哪一個ID?例如爲什麼你有1,蘋果而不是2,蘋果在預期的結果? –

+0

我只想列出CATEGORY中所有逗號分隔的值作爲單個行,沒有任何重複值。 – Learner

回答

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列表返回函數不鼓勵,不應該被使用任何更多,這就是爲什麼我將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

+0

你是一個天才兄弟 – Learner

+0

它就像一個魅力! :) – Learner

+0

非常感謝你如此如此如此 – Learner