SQLite: ファイル名のみを拡張子なしで抽出する方法
SQLite: ファイル名のみを拡張子なしで抽出する
サブストリング関数を使用する
最もシンプルな方法は、サブストリング関数を使用して、拡張子部分を削除することです。
SELECT SUBSTR(filename, 1, LENGTH(filename) - LENGTH(regexp_substr(filename, '\.[^.]*$'))) AS filename_without_extension
FROM your_table;
このクエリは、以下の処理を行います。
LENGTH(filename)
: ファイル名の長さLENGTH(regexp_substr(filename, '\.[^.]*$'))
: 拡張子の長さSUBSTR(filename, 1, LENGTH(filename) - LENGTH(regexp_substr(filename, '\.[^.]*$')))
: 拡張子部分を削除したファイル名
正規表現を使用して、拡張子部分をマッチングすることもできます。
SELECT REGEXP_REPLACE(filename, '\.[^.]*$', '') AS filename_without_extension
FROM your_table;
\.[^.]*$
: 拡張子のパターンREGEXP_REPLACE(filename, '\.[^.]*$', '')
: 拡張子部分を空文字に置き換える
ファイル名関数を使用する
SQLite 3.31以降では、FILENAME()
関数を使用して、ファイル名のみを抽出することができます。
SELECT FILENAME(filename) AS filename_without_extension
FROM your_table;
このクエリは、FILENAME()
関数を使用して、拡張子部分を自動的に削除します。
SELECT
CASE
WHEN INSTR(filename, '.') > 0 THEN
SUBSTR(filename, 1, INSTR(filename, '.'))
ELSE
filename
END AS filename_without_extension
FROM your_table;
INSTR(filename, '.')
: 拡張子の位置SUBSTR(filename, 1, INSTR(filename, '.'))
: 拡張子部分を削除したファイル名CASE WHEN ... ELSE ... END
: 条件分岐
例
以下の表で、filename
列の値に対して、上記の方法でファイル名のみを抽出してみましょう。
filename | filename_without_extension (サブストリング関数) | filename_without_extension (正規表現) | filename_without_extension (FILENAME関数) | filename_without_extension (CASE式) |
---|---|---|---|---|
image.png | image | image | image | image |
document.pdf | document | document | document | document |
video.mp4 | video | video | video | video |
no_extension | no_extension | no_extension | no_extension | no_extension |
上記のように、SQLite では様々な方法でファイル名のみを抽出することができます。状況に合わせて最適な方法を選択してください。
-- サンプルデータの作成
CREATE TABLE files (
id INTEGER PRIMARY KEY AUTOINCREMENT,
filename TEXT NOT NULL
);
INSERT INTO files (filename) VALUES
('image.png'),
('document.pdf'),
('video.mp4'),
('no_extension');
-- サブストリング関数を使用する
SELECT
id,
filename,
SUBSTR(filename, 1, LENGTH(filename) - LENGTH(regexp_substr(filename, '\.[^.]*$'))) AS filename_without_extension
FROM files;
-- 正規表現を使用する
SELECT
id,
filename,
REGEXP_REPLACE(filename, '\.[^.]*$', '') AS filename_without_extension
FROM files;
-- ファイル名関数を使用する (SQLite 3.31以降)
SELECT
id,
filename,
FILENAME(filename) AS filename_without_extension
FROM files;
-- CASE 式を使用する
SELECT
id,
filename,
CASE
WHEN INSTR(filename, '.') > 0 THEN
SUBSTR(filename, 1, INSTR(filename, '.'))
ELSE
filename
END AS filename_without_extension
FROM files;
id | filename | filename_without_extension
---+--------------+-------------------------
1 | image.png | image
2 | document.pdf | document
3 | video.mp4 | video
4 | no_extension | no_extension
説明
上記のサンプルコードでは、以下の処理を行っています。
CREATE TABLE files
で、id
列とfilename
列を持つテーブルを作成します。INSERT INTO files
で、サンプルデータをテーブルに挿入します。- 4つの方法それぞれで、ファイル名のみを抽出するクエリを実行します。
- クエリ結果を
id
,filename
,filename_without_extension
の順に表示します。
各方法の詳細
FILENAME関数を使用する (SQLite 3.31以降)
FILENAME(filename)
: 拡張子部分を自動的に削除したファイル名
注意事項
- 上記のサンプルコードは、SQLite 3.31以降で動作します。
- ファイル名にドット (
.
) が複数含まれている場合、最初のドット以降の部分が削除されます。 - 拡張子が空文字の場合、空文字が抽出されます。
SQLite でファイル名のみを抽出するその他の方法
SQL関数 LEFT() と RIGHT() を使用する
SELECT
id,
filename,
LEFT(filename, LENGTH(filename) - LENGTH(regexp_substr(filename, '\.[^.]*$'))) AS filename_without_extension
FROM files;
このクエリは、LEFT()
関数を使用して、ファイル名の先頭から拡張子部分を除いた文字列を取得します。
SELECT
id,
filename,
SUBSTR(filename, 1, INSTR(filename, '.')) AS filename_without_extension
FROM files;
このクエリは、INSTR()
関数を使用して、拡張子の開始位置を取得し、SUBSTR()
関数を使用して、その位置から先頭の文字列を取得します。
SELECT
id,
filename,
TRIM(filename, '.') AS filename_without_extension
FROM files;
このクエリは、TRIM()
関数を使用して、ファイル名の末尾のドット (.
) を削除します。ただし、この方法は、ファイル名に他の余分な空白が含まれている場合にのみ役立ちます。
SQLite 内蔵関数 basename() を使用する (SQLite 3.30 より新機能)
SELECT
id,
filename,
basename(filename) AS filename_without_extension
FROM files;
このクエリは、basename()
関数を使用して、ファイル名からパスと拡張子を削除します。この関数は SQLite 3.30 以降でのみ使用できます。
SQLite 拡張モジュールを使用する
SELECT
id,
filename,
filename_without_extension(filename) AS filename_without_extension
FROM files;
- シンプルでわかりやすい方法が必要な場合は、
SUBSTR()
関数と正規表現を使用する方法がおすすめです。 - ファイル名にドット (
.
) が複数含まれている可能性がある場合は、LEFT()
関数とRIGHT()
関数を使用する方法がおすすめです。 - SQLite 3.30 以降を使用している場合は、
basename()
関数を使用する方法がおすすめです。 - 拡張機能を使用して追加機能が必要な場合は、SQLite 拡張モジュールを使用する方法がおすすめです。
- 上記の方法は、いずれも SQLite 標準の機能または拡張モジュールを使用しています。
- ファイル名に特殊文字が含まれている場合、適切に処理されない可能性があります。
- 拡張子の一部がファイル名の一部である場合、これらの方法で正しく抽出されない可能性があります。
sqlite