如何通过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查询获取文件的文件扩展名?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 graphql 查询中按文件扩展名过滤

如何通过 file_get_contents 获取文件扩展名

如何通过套接字将文件从设备A发送到B时获取文件名(包括扩展名“.jpg”或“mp3”)

如何通过navicat for mysql将sql文件导入mysql

如何获取给定文件夹中具有特定扩展名的文件列表?

如何在不基于扩展的 IOS 中获取 Mime 类型