在postgresql中拆分列

时间:2016-02-19 18:47:48

标签: regex postgresql split

如果它有值,我怎么能把字体称为SOMETHING

  

“英国人,出生于英格兰19202013”​​

分为四列:

  

英国,英格兰,1920年,2013年

2 个答案:

答案 0 :(得分:1)

考虑这个例子。您可以将src.something替换为您的实际字段。

<强>更新

更新了查询以允许该源字符串中的“缺少数据”。这也允许内容处于各种不同的位置,例如“英国人,出生于1920年英格兰”和“英国人,出生于英国19202013”​​也将起作用。它非常灵活,可以容忍脏数据。

如果这样可以解决您的问题,请标记为答案。 TQ。

SELECT  substring( src.something from '(\S+)\s*,')      AS citizenship
    , substring( src.something from 'born\s+in\s+(\S+)')    AS country
    , substring( src.something from '(\d{4})(\d{4})?')  AS fromyear
    , substring( src.something from '\d{4}(\d{4})')     AS toyear
FROM    (
        SELECT 'british, born in England 19202013'::TEXT AS something
    ) AS src;

它将返回以下结果:

enter image description here

答案 1 :(得分:1)

WITH t(something) AS ( VALUES
  ('british, born in England 19202013'::TEXT)
)
SELECT
  split_part(s[1],',',1) AS col1,
  s[4] AS col2,
  substr(s[5],1,4) AS col3,
  substr(s[5],5) AS col4
FROM t,
  regexp_split_to_array(t.something,E'\\s+') s;

结果:

  col1   |  col2   | col3 | col4 
---------+---------+------+------
 british | England | 1920 | 2013
(1 row)

更新

为了在表中填充这些值,您需要更改第1个表而不是执行更新:

-- add columns
ALTER TABLE t
    ADD COLUMN col1 TEXT,
    ADD COLUMN col2 TEXT,
    ADD COLUMN col3 INTEGER,
    ADD COLUMN col4 INTEGER;

-- perform update
WITH splitted_data AS (
    SELECT
      split_part(s[1],',',1) AS col1,
      s[4] AS col2,
      substr(s[5],1,4) AS col3,
      substr(s[5],5) AS col4,
      something
    FROM t,
      regexp_split_to_array(t.something,E'\\s+') s
)
UPDATE t SET
  col1=sd.col1,
  col2=sd.col2,
  col3=sd.col3::INTEGER,
  col4=sd.col4::INTEGER
FROM (
  SELECT col1,col2,col3,col4,something FROM splitted_data
) AS sd
WHERE t.something = sd.something;