像这样的东西:
CREATE TABLE testbed (p_id int4,name varchar(50),skills text);
INSERT INTO testbed VALUES
(1,'Sam','#IT #communication #administration'),
(2,'Alex','#French #Trainer');
SELECT row_number() OVER () AS id,
p_fid, skill
FROM (SELECT
p_id AS p_fid,
regexp_split_to_table(
regexp_replace(skills, '^#', ''),
'[ ]+#') AS skill FROM testbed) AS s;
请查看Window、
String 操作和Array函数的文档。
如果您确实需要控制技能的位置,则需要更复杂的查询:
WITH arrays AS (
SELECT p_id,
regexp_split_to_array(regexp_replace(skills, '^#', ''), '[ ]+#') arr
FROM testbed
), series AS (
SELECT p_id, generate_series(1, array_upper(arr, 1)) i
FROM arrays
)
SELECT row_number() OVER (ORDER BY a.p_id, s.i) AS id,
a.p_id AS p_fid,
a.arr[s.i] AS skill
FROM arrays a
JOIN series s ON a.p_id = s.p_id
ORDER BY a.p_id, s.i;