事情是這樣的:
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 manipulation和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;
的問題是,我甚至不知道從哪裏開始,我知道肯定是我需要正則表達式,但問題是在SQL你不能使用循環,你可以看到一行可能有多個井號標籤,所以基本上我卡住了 – Ali