2012-08-01 202 views
0

我正在使用Postgres 8.3.11。我有一個表,如:從字符串創建表

user | countries (varchar(100)) 
    h | us 
    g | brazil,germany 

我想什麼是顯而易見的

user | countries 
    h | us 
    g | brazil 
    g | germany 

我創建了一個獲得像「巴西,德國」,並將其作爲一個單列表中的字符串函數:

|germany| 
    |brazil | 

我可以使用光標通過排走行,並執行它來得到我想要的東西,但必須有一個更好的SQL十歲上下的方式。

+0

如果您已經有了一個函數來取代列表,爲什麼不簡單地將結果加入到基表中呢?順便說一句:使用當前版本的PostgreSQL會容易得多。 8.3即將退休! – 2012-08-01 09:14:20

+0

每一行都有不同的結果,那麼「簡單加入結果」是什麼意思? – harelg 2012-08-01 13:07:34

回答

1
regexp_split_to_table()

(在8.3本Postgres的)應使這個容易:

SELECT usr, regexp_split_to_table(countries, ',') AS country FROM tbl; 

結果:

usr | country 
-----+--------- 
h | us 
g | brazil 
g | germany 

隨着短字符串這仍然是在9.1的PostgreSQL優選的解決方案。

儘管如此,regexp_split_to_table()的性能會隨着較長的字符串而降低。用8.4+代替unnest(string_to_array(...))

因爲拋開PostgreSQL 8.3變老。考慮upgrading to the current version 9.1(9.2即將發佈)。