2015-10-20 13 views
1

我想用從另一列作看法,我有此列:如何在psql的更多列中拆分列?

stack_prices : 1=1.95 | 3=1.89 | 10=1.85 

我想使(在這個例子中)6列,如:

stack_size1: 1 stack_price1: 1.95 
stack_size2: 3 stack_price2: 1.89 
stack_size3: 10 stack_price3: 1.85 

我試着有子,還挺工作,但被硬編碼這個例子:

substr(cp.stack_prices,3,4) AS company_product_price1, 
substr(cp.stack_prices,1,1) AS company_product_stack_size1 etc... 

其實我是想|和後分裂3210。

+1

你應該考慮讓你的數據庫中的關係,因爲大多數SQL引擎不適合於這種轉變。 –

+1

一個數據庫字段只能包含數據而不能包含一組數據 –

+0

對我來說不幸的是我不能用stack_prices列修改表 –

回答

0

你需要做的是在兩個階段:

  1. 分裂由'|'
  2. 分裂由'='

您可以使用string_to_array這樣的:

SELECT 
    'stack_size'|| id || ': ' || trim(split2[1]), 
    'stack_price'|| id || ': ' || trim(split2[2]) 
FROM (
    SELECT row_number() OVER() AS id, string_to_array(sub.split1, '=') as split2 
    FROM (
     (SELECT unnest(string_to_array(stack_prices, '|')) AS split1 FROM company_product) 
    ) sub 
) sub 

編輯:

以上查詢的輸出將在您寫入問題時變得非常簡單。它可以使用到proccess一行只如果你想(當然,你可以把這個存儲過程)

更通用的解決方案有6列在一排有一個去:

SELECT 
    stack_prices, 
    split1_1[1] as ss1, split1_1[2] as sp1, 
    split1_2[1] as ss2, split1_2[2] as sp2, 
    split1_3[1] as ss3, split1_3[2] as sp3 
FROM (
    SELECT 
     stack_prices, 
     regexp_split_to_array(split1[1], E'=') as split1_1, 
     regexp_split_to_array(split1[1], E'=') as split1_2, 
     regexp_split_to_array(split1[1], E'=') as split1_3 
    FROM (
     select 
      stack_prices, 
      regexp_split_to_array(stack_prices, E'\\ \\|\\ ') as split1 
     from company_product 
    ) sub 
) sub 
0

這是加工。

從company_product cp中選擇split_part((split_part(cp.stack_prices,'|',1)),'=',1) 從company_product cp中選擇split_part((split_part(cp.stack_prices,'|',1)),'=',2)

從company_product cp中選擇split_part((split_part(cp.stack_prices,'|'2)),'=',1) 從company_product cp選擇split_part((split_part(cp.stack_prices,'|',2)),'=',2)

從company_product cp中選擇split_part((split_part(cp.stack_prices,'|'3)),'=',1); 從company_product cp中選擇split_part((split_part(cp.stack_prices,'|',3)),'=',2)

+0

使用'string_to_array'和'unnest'可以爲將來的重用提供更一般的解決方案。考慮[我的答案](http://stackoverflow.com/a/33231870/5404196) –

0

醜陋的問題:醜陋的解決方案:

CREATE TABLE stack_prices (
     ugly_string text 
     ); 

INSERT INTO stack_prices (ugly_string) VALUES 
('1=1.95 | 3=1.89 | 10=1.85'); 

SELECT ugly_string AS orig 
, regexp_replace(ugly_string, ' *([0-9])*=.*', '\1') AS n1 
, regexp_replace(ugly_string, ' *[0-9]*=([0-9.]*).*', '\1') AS v1 
, regexp_replace(ugly_string, ' *[0-9]*=[0-9.]* \| ([0-9]*)=.*', '\1') AS n2 
, regexp_replace(ugly_string, ' *[0-9]*=[0-9.]* \| [0-9]*=([0-9.]*) \|.*', '\1') AS v2 
, regexp_replace(ugly_string, ' *[0-9]*=[0-9.]* \| [0-9]*=[0-9.]* \| ([0-9]*).*', '\1') AS n3 
, regexp_replace(ugly_string, ' *[0-9]*=[0-9.]* \| [0-9]*=[0-9.]* \| [0-9]*=([0-9.]*).*', '\1') AS v3 
FROM stack_prices 
     ; 

結果:

CREATE TABLE 
INSERT 0 1 
      orig   | n1 | v1 | n2 | v2 | n3 | v3 
---------------------------+----+------+----+------+----+------ 
1=1.95 | 3=1.89 | 10=1.85 | 1 | 1.95 | 3 | 1.89 | 10 | 1.85 
(1 row)