目前尚不十分清楚您需要如何處理這些數據。如果你真的需要在數據庫中完全處理它(看起來像你最喜歡的腳本語言的任務),一種選擇是使用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 ...
查詢的其餘部分是相同的。
我想第二種情況下的表格形式的數據也 –
我已經添加了如何在第二種情況下填充表的示例,但它仍然不清楚你到底想要什麼。 – rkhayrov