2013-10-17 22 views
0
分割字符串將值插入多列

我有文字的下面堆:在PostgreSQL的

"BundleSize,155648,DynamicSize,204800,Identifier,com.URLConnectionSample,Name, 
URLConnectionSample,ShortVersion,1.0,Version,1.0,BundleSize,155648,DynamicSize, 
16384,Identifier,com.IdentifierForVendor3,Name,IdentifierForVendor3,ShortVersion, 
1.0,Version,1.0,". 

我想要做的是提取數據,從這個以下方式:

BundleSize:155648 
DynamicSize:204800 
Identifier:com.URLConnectionSample 
Name:URLConnectionSample 
ShortVersion:1.0 
Version:1.0 

BundleSize:155648 
DynamicSize:16384 
Identifier:com.IdentifierForVendor3 
Name:IdentifierForVendor3 
ShortVersion:1.0 
Version:1.0 

歡迎提供所有提示和建議。

回答

1

目前尚不十分清楚您需要如何處理這些數據。如果你真的需要在數據庫中完全處理它(看起來像你最喜歡的腳本語言的任務),一種選擇是使用hstore

轉換記錄逐個很容易:

假設

%S = BundleSize,155648,DynamicSize,204800,標識符,com.URLConnectionSample,名稱,URLConnectionSample,ShortVersion,1.0,版本,1.0

SELECT * FROM each(hstore(string_to_array(%s, ','))); 

輸出:

 key  |   value   
--------------+------------------------- 
Name   | URLConnectionSample 
Version  | 1.0 
BundleSize | 155648 
Identifier | com.URLConnectionSample 
DynamicSize | 204800 
ShortVersion | 1.0 

如果你有精確匹配字段名稱列的表(注意引號,populate_record是大小寫敏感的鍵名):

CREATE TABLE data (
    "BundleSize" integer, "DynamicSize" integer, "Identifier" text, 
    "Name" text, "ShortVersion" text, "Version" text); 

您可以將hstore記錄到這樣的:

INSERT INTO data SELECT * FROM 
    populate_record(NULL::data, hstore(string_to_array(%s, ','))); 

如果您有多個記錄的逗號分隔值,事情會變得更加複雜。

%S = BundleSize,155648,DynamicSize,204800,標識符,com.URLConnectionSample,名稱,URLConnectionSample,ShortVersion,1.0,版本,1.0,BundleSize,155648,DynamicSize,16384,標識符,com.IdentifierForVendor3,名稱,IdentifierForVendor3,ShortVersion,1.0,Version,1.0,

您需要首先將數組拆分爲大塊number_of_fields * 2 = 12元素。

SELECT hstore(row) FROM (
    SELECT array_agg(str) AS row FROM (
     SELECT str, row_number() OVER() AS i FROM 
     unnest(string_to_array(%s, ',')) AS str 
    ) AS str_sub 
    GROUP BY (i - 1)/12) AS row_sub 
WHERE array_length(row, 1) = 12; 

輸出:

"Name"=>"URLConnectionSample", "Version"=>"1.0", "BundleSize"=>"155648", "Identifier"=>"com.URLConnectionSample", "DynamicSize"=>"204800", "ShortVersion"=>"1.0" 
"Name"=>"IdentifierForVendor3", "Version"=>"1.0", "BundleSize"=>"155648", "Identifier"=>"com.IdentifierForVendor3", "DynamicSize"=>"16384", "ShortVersion"=>"1.0" 

並插入到上述表的:

INSERT INTO data SELECT (populate_record(NULL::data, hstore(row))).* FROM ... 

查詢的其餘部分是相同的。

+0

我想第二種情況下的表格形式的數據也 –

+1

我已經添加了如何在第二種情況下填充表的示例,但它仍然不清楚你到底想要什麼。 – rkhayrov