如果它有值,我怎么能把字体称为SOMETHING
“英国人,出生于英格兰19202013”
分为四列:
英国,英格兰,1920年,2013年
答案 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;
它将返回以下结果:
答案 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;