从 SQL 语句到函数
From SQL statement to function
有没有办法把
WITH RECURSIVE cte(path) AS ( --Recursively call on path (Works for every length)
SELECT array[r.term1_id, r.term2_id] AS path
FROM temp_table r
LEFT JOIN temp_table r0 ON r0.term1_id = r.term2_id
WHERE r0.term2_id IS NULL
UNION ALL
SELECT r.term1_id || c.path
FROM cte c
JOIN temp_table r ON r.term2_id = c.path[1]
),
max_len AS (
SELECT max(array_length(path, 1)) max_len
FROM cte
)
SELECT array_to_string(fill_with_last_element(path, max_len), ',' , '*')
FROM cte
CROSS JOIN max_len
ORDER BY path;
进入存储过程?
我想把这个函数做成一个存储过程。
fill_with_last_element(path, max_len)
数据库中是否已有函数,一个存储过程可以调用另一个存储过程吗?
是的,你可以把它变成一个函数(Postgres 没有过程):
create function get_data()
returns table (path text)
as
$$
WITH RECURSIVE cte(path) AS ( --Recursively call on path (Works for every length)
SELECT array[r.term1_id, r.term2_id] AS path
FROM temp_table r
LEFT JOIN temp_table r0 ON r0.term1_id = r.term2_id
WHERE r0.term2_id IS NULL
UNION ALL
SELECT r.term1_id || c.path
FROM cte c
JOIN temp_table r ON r.term2_id = c.path[1]
),
max_len AS (
SELECT max(array_length(path, 1)) max_len
FROM cte
)
SELECT array_to_string(fill_with_last_element(path, max_len), ',' , '*')
FROM cte
CROSS JOIN max_len
ORDER BY path;
$$
language sql;
有没有办法把
WITH RECURSIVE cte(path) AS ( --Recursively call on path (Works for every length)
SELECT array[r.term1_id, r.term2_id] AS path
FROM temp_table r
LEFT JOIN temp_table r0 ON r0.term1_id = r.term2_id
WHERE r0.term2_id IS NULL
UNION ALL
SELECT r.term1_id || c.path
FROM cte c
JOIN temp_table r ON r.term2_id = c.path[1]
),
max_len AS (
SELECT max(array_length(path, 1)) max_len
FROM cte
)
SELECT array_to_string(fill_with_last_element(path, max_len), ',' , '*')
FROM cte
CROSS JOIN max_len
ORDER BY path;
进入存储过程?
我想把这个函数做成一个存储过程。
fill_with_last_element(path, max_len)
数据库中是否已有函数,一个存储过程可以调用另一个存储过程吗?
是的,你可以把它变成一个函数(Postgres 没有过程):
create function get_data()
returns table (path text)
as
$$
WITH RECURSIVE cte(path) AS ( --Recursively call on path (Works for every length)
SELECT array[r.term1_id, r.term2_id] AS path
FROM temp_table r
LEFT JOIN temp_table r0 ON r0.term1_id = r.term2_id
WHERE r0.term2_id IS NULL
UNION ALL
SELECT r.term1_id || c.path
FROM cte c
JOIN temp_table r ON r.term2_id = c.path[1]
),
max_len AS (
SELECT max(array_length(path, 1)) max_len
FROM cte
)
SELECT array_to_string(fill_with_last_element(path, max_len), ',' , '*')
FROM cte
CROSS JOIN max_len
ORDER BY path;
$$
language sql;