如何从 PostgreSQL 中的文件名获取文件扩展名?

How to get file extension from filename in PostgreSQL?

使用 PostgreSQL 9.3。 有一列包含这样的文件名值:

qwerty.swf
some.image.jpg
some.other.image.jpg 

此列也允许空值。

如何从 sql 查询中的这一列获取文件扩展名?

使用 regexp 执行此操作。

select regexp_matches(filename,'\.(\w+)$')
from tablename
where filename ~ '\.' --check if filename has atleast 1 . character in it

Sample fiddle

substringreversestrpos 的组合。

select reverse(substring(reverse(filename) from 1 for strpos(reverse(filename),'.')-1))
from tablename
where filename ~ '\.' --check if filename has atleast 1 . character in it

尝试:

    with mytable as (
    select unnest(string_to_array($$qwerty.swf
    some.image.jpg
    some.other.image.jpg
    test
    $$,E'\n')) filename)

    select filename,substring(filename from '\.([^\.]*)$') 
    from mytable

如果你想从 URL 中提取文件的扩展名,事情会稍微困难一些,因为 URL 例如 https://whatever.com 可以用于文件描述符,导致 com 作为扩展名。

这是我的方法。

create or replace function url_ext (s varchar)
returns varchar
immutable language sql as $$
  select substring(s from '^http[s]?:\/\/.*\/.*\.([A-z0-9_-]*)$');
$$;

这些是一些测试:

select 
    url_ext('http://whatever.com'),
    url_ext('https://whatever.com'),
    url_ext('https://whatever.com/something/more/file.pdf'),
    url_ext('https://whatever.com/file.pdf'),
    url_ext('https://whatever.com/something/more/slug');

url_ext|url_ext|url_ext|url_ext|url_ext|
-------+-------+-------+-------+-------+
       |       |pdf    |pdf    |       |