如何通过sql查询获取文件的文件扩展名?
Posted
技术标签:
【中文标题】如何通过sql查询获取文件的文件扩展名?【英文标题】:How to get file extension of file as a result of sql query? 【发布时间】:2012-06-12 07:40:05 【问题描述】:我有一个名为 datas
的表,我正在执行如下查询:
SELECT linkurl AS DOWNLOADURL,
lastrevlevel AS VERSION,
code AS DESCRIPTION,
created AS RELEASEDATE,
name AS TYPE
FROM datas
WHERE id IN (SELECT child_id
FROM datas _datas
WHERE parent_id = (SELECT Max(id)
FROM datas
WHERE code = 'AN4307SW'))
它返回如下结果:
DOWNLOADURL VERSION DESCRIPTION RELEASEDATE TYPE
/artifacts/download.txt 2.0 images 25/6/12 download.txt
在Type
列中,我正在获取文件的名称。我需要在Type
列中获取文件名的文件扩展名。我怎样才能做到这一点?
例子:
TYPE
.txt
.pdf
.xls
【问题讨论】:
如果我有一个名为Test.Document.doc
的文件,您希望发生什么?如果没有指定扩展怎么办?
@bridge 我只想要文件扩展名
@anto 所以最后一个点之后的子字符串——在我的例子中是doc
。是否可能存在没有扩展名的文件(根本不包含点?)
@bridge:是的,有可能没有得到 dot,那我应该如何进行
@anto 在这种情况下,如果没有点,使用SUBSTRING_INDEX
的接受答案将返回文件的全名。这可以接受吗?
【参考方案1】:
您可以使用SUBSTRING_INDEX
。像这样:
select linkurl as DOWNLOADURL,lastrevlevel as VERSION,
code as DESCRIPTION,created as RELEASEDATE,
SUBSTRING_INDEX(name,'.',-1) as TYPE
from datas where id in
(select child_id from datas _datas
where parent_id=( select max(id) from datas
where code = 'AN4307SW'))
编辑
如果您看到有关此功能的文档,我认为这将很好地满足您的要求。
返回字符串 str 在 count 出现之前的子字符串 分隔符 delim。如果计数是正数,则左边的所有内容 最后的分隔符(从左数)被返回。如果计数是 负数,最后定界符右侧的所有内容(计数 从右边)返回。 SUBSTRING_INDEX() 执行 搜索 delim 时区分大小写。
这也将处理这样的情况:
select SUBSTRING_INDEX('Test.Document.doc','.',-1);
EDIT2
如果您使用的是 oracle。下次请在正确的事项中标记问题。 oracle 中没有SUBSTRING_INDEX
。但是我可以看到你可以很容易地做到这一点:
SELECT SUBSTR('Test.Document.doc', INSTR('Test.Document.doc', '.',-1))
FROM dual;
这样的完整查询:
select linkurl as DOWNLOADURL,lastrevlevel as VERSION,
code as DESCRIPTION,created as RELEASEDATE,
SUBSTR(name, INSTR(name, '.',-1)) as TYPE
from datas where id in
(select child_id from datas _datas
where parent_id=( select max(id) from datas
where code = 'AN4307SW'))
参考here
【讨论】:
thnks 但是当我执行此查询时,它显示无效标识符 SUBSTRING_INDEX .. 我正在使用 oracle 标签中的@anto 你提到了mysql。 @arion: 谢谢它很好用,如果我需要 .txt,.pdf,.xls 我应该怎么做? @anto :我更新了答案。您需要删除 +1。看看【参考方案2】:select linkurl as DOWNLOADURL,lastrevlevel as VERSION,
code as DESCRIPTION,created as RELEASEDATE,reverse(substring(reverse(name), 1,charindex('.', reverse(name))-1)) as TYPE
from datas where id in
(select child_id from datas _datas
where parent_id=( select max(id) from datas
where code = 'AN4307SW'))
【讨论】:
...刚刚试过这个解决方案效果很好,还涵盖了文件名可能看起来像这样的场景 'some.thing.txt'【参考方案3】:认为你需要这样的东西
SELECT REPLACE(name,SUBSTRING(name ,0, CHARINDEX('.', name )),'')
【讨论】:
选择 REVERSE(SUBSTRING(REVERSE(name),1,LOCATE('.',REVERSE(name),1))) 我想将它作为另一个答案发布,但它被错误地发布为评论。但我如何删除这条评论?没有删除选项【参考方案4】:SELECT REVERSE(SUBSTRING(REVERSE(name),1,LOCATE('.',REVERSE(name),1)));
【讨论】:
【参考方案5】:可以这样实现
SELECT SUBSTRING_INDEX(FILE_NAME,"." ,-1) from TABLE_NAME
【讨论】:
【参考方案6】:SELECT
SUBSTRING(file_name,(LENGTH(file_name)-LOCATE('.',REVERSE(file_name)))+2)
FROM <table name> WHERE file_id=<file_id>;
【讨论】:
以上是关于如何通过sql查询获取文件的文件扩展名?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 file_get_contents 获取文件扩展名
如何通过套接字将文件从设备A发送到B时获取文件名(包括扩展名“.jpg”或“mp3”)