您如何在存储过程中读取csv,以便csv需要数据提取?

时间:2016-11-10 13:02:23

标签: postgresql csv stored-procedures

csv的格式为网址 -

www.domain.com/table_id/x_y_height_width.jpg

我们希望从存储过程中的这些URL中提取table_id,x,y,height和width,然后在多个sql查询中使用这些参数。

我们怎么能这样做?

1 个答案:

答案 0 :(得分:2)

regexp_split_to_array and split_part functions

create or replace function split_url (
    _url text, out table_id int, out x int, out y int, out height int, out width int
) as $$
    select
        a[2]::int,
        split_part(a[3], '_', 1)::int,
        split_part(a[3], '_', 2)::int,
        split_part(a[3], '_', 3)::int,
        split_part(split_part(a[3], '_', 4), '.', 1)::int
    from (values
        (regexp_split_to_array(_url, '/'))
    ) rsa(a);
$$ language sql immutable;

select *
from split_url('www.domain.com/234/34_12_400_300.jpg');
 table_id | x  | y  | height | width 
----------+----+----+--------+-------
      234 | 34 | 12 |    400 |   300

要将该功能与其他表一起使用lateral

with t (url) as ( values
    ('www.domain.com/234/34_12_400_300.jpg'),
    ('www.examplo.com/984/12_90_250_360.jpg')
)
select *
from
    t
    cross join lateral
    split_url(url)
;
                  url                  | table_id | x  | y  | height | width 
---------------------------------------+----------+----+----+--------+-------
 www.domain.com/234/34_12_400_300.jpg  |      234 | 34 | 12 |    400 |   300
 www.examplo.com/984/12_90_250_360.jpg |      984 | 12 | 90 |    250 |   360