SQLで拡張子付きファイル名から拡張子を取得

「aaa.jpg」のようなファイル名が格納されているテーブルに対して、何の拡張子が使われてるか調査する機会があったため、備忘録として残します。 割と限定的な状況なので、役立つ機会はあまりないかもしれませんが...。あと地味にタイトルが難しい。タイトルが微妙なのも、限定的なのが原因ですね...。

準備

create table hoge_files (
    id bigserial,
    file_name character varying(1000),
    primary key (id)
)
;

insert into hoge_files (file_name) values
('aaa.jpg'),
('bbb.xlsx'),
('ccc.zip'),
('ddd.jpg')
;

取得クエリ

select
    distinct ext
from
    (
        select
            substring(full_file_name from length(file_name)+2) ext
        from
            (
                select
                    split_part(file_name, '.', 1) file_name,
                    file_name full_file_name
                from hoge_files
            ) files
    ) ext_files
order by ext
;

実行結果

 ext  
------
 jpg
 xlsx
 zip
(3 rows)

ちょっと特殊なパターンのとき

  • 拡張子がない
  • 拡張子を除いたファイル名にドットが含まれる
insert into hoge_files (file_name) values
('eee'),
('fff.fff.png')
;

実行結果

   ext   
---------
 
 fff.png
 jpg
 xlsx
 zip
(5 rows)

そもそもファイル名にドットなんて入れるなという話ですが。 こういうパターンはあまりないと思われますし、単に調査するだけなら問題ないでしょう。 どうしても拡張子のみ抽出したい場合、RubyなりPythonなりscriptで対処する方が良いと思います。

参考

[1] https://www.postgresql.org/docs/13/functions-string.html