【问题标题】:Remove extensions from filename从文件名中删除扩展名
【发布时间】:2012-06-29 19:05:46
【问题描述】:

我正在使用 SQL。

在表 tblDemo 中,其中一列是“文件名”。此列的每一行都包含具有任何扩展名的不同文件名。 例如。 'flower.jpeg'、'batman.mov'、study.pdf 等

请在查询中向我提出建议,该查询可以帮助我从“文件名”列的每一行中删除扩展名(以及点)。这样我就可以只获取名称 Ex。 “花”、“蝙蝠侠”、“学习”等

谢谢

【问题讨论】:

标签: sql tsql


【解决方案1】:

在 MySQL 中,这对我有用。

set @file = 'test1.test2.test3.docx';

SELECT      substring(@file, 1, (length(@file) - (length(substring_index(@file, '.', -1)) + 1))) as 'name_file',
            substring_index(@file, '.', -1) as 'extension';

【讨论】:

    【解决方案2】:

    这是一个返回所需结果的简单选择语句:

     SELECT  [Filename], SUBSTRING([Filename], 1, charindex('.',[Filename])-1) as [New name] FROM [Table]
    

    【讨论】:

      【解决方案3】:

      我需要删除所有扩展名,即:.tar.gz 或 .txt.out。这就是在 SQL Server 中对我有用的方法:

      CREATE FUNCTION RemoveFileExt
      (
          @fullpath nvarchar(500)
      )
      RETURNS nvarchar(500)
      AS
      BEGIN
          IF(CHARINDEX('.', @fullpath) > 0)
          BEGIN
             SELECT @fullpath = SUBSTRING(@fullpath, 1, CHARINDEX('.', @fullpath)-1)
          END
          RETURN @fullpath
      END;
      
      CREATE FUNCTION RemoveFileExtAll
      (
          @fullpath nvarchar(500)
      )
      RETURNS nvarchar(500)
      AS
      BEGIN
          IF(CHARINDEX('.', @fullpath) > 0)
          BEGIN
              SELECT @fullpath = dbo.RemoveFileExt(@fullpath)
          END
          RETURN @fullpath
      END;
      
      select dbo.RemoveFileExtAll('test.tar.gz');
      
      OUTPUT> test
      

      作为奖励,仅从 Linux 或 Windows 中的完全限定路径中获取基本名称:

      CREATE FUNCTION GetBaseName
      (
          @fullpath nvarchar(500)
      )
      RETURNS nvarchar(500)
      AS
      BEGIN
          IF(CHARINDEX('/', @fullpath) > 0)
          BEGIN
             SELECT @fullpath = RIGHT(@fullpath, CHARINDEX('/', REVERSE(@fullpath)) -1)
          END
          IF(CHARINDEX('\', @fullpath) > 0)
          BEGIN
             SELECT @fullpath = RIGHT(@fullpath, CHARINDEX('\', REVERSE(@fullpath)) -1)
          END
          RETURN @fullpath
      END;
      
      select dbo.GetBaseName('/media/drive_D/test.tar.gz');
      
      OUTPUT> test.tar.gz
      
      select dbo.GetBaseName('D:/media/test.tar.gz');
      
      OUTPUT> test.tar.gz
      
      select dbo.GetBaseName('//network/media/test.tar.gz');
      
      OUTPUT> test.tar.gz
      

      【讨论】:

        【解决方案4】:

        在 Sql Server 上测试。这显示没有扩展名的文件名,更改为 Update / Set 以修改数据。

        SELECT left([FileName], len([FileName]) - charindex('.', reverse([FileName]))) 
          FROM tblDemo
        

        已编辑:使用反向修改,因此当字段包含多个点时也可以使用。

        这里是更新表格版本:

        UPDATE Testing 
           Set [FileName] = left([FileName], 
                                 len([FileName]) - charindex('.', Reverse([FileName])))
        

        【讨论】:

        • Ben/Jcis - 在提到的查询中修改什么,以考虑与此类似的情况:- 'This.Is.My.Filename.Txt'
        • @Jcis - 非常感谢朋友。刚刚接受了约翰的回答,因为他首先回答了多点问题。你的答案是绝对正确的。
        【解决方案5】:

        试试这个:

        UPDATE TableName
        SET FileName = REVERSE(SUBSTRING(REVERSE(FileName), 
                               CHARINDEX('.', REVERSE(FileName)) + 1, 999))
        

        View For a DEMO @ SQLFiddle.com

        【讨论】:

        • 你的冠军。有效。它确实从文件名中删除了扩展名,即使文件名中有多个“点”。我会稍微编辑您的帖子,以便将来对其他人有所帮助。
        • 对于 MySQL 用户使用 LOCATE 而不是 CHARINDEX
        • @JohnWoo 和 999 有什么关系?
        • @johnny5 999 是字符串(文件名)的起始参数。来自w3schools.com/sql/func_sqlserver_charindex.asp:“搜索将开始的位置(如果您不想从字符串的开头开始)。字符串中的第一个位置是 1。”如果列中有超过 999 个字符的字符串,则必须修改此参数。在大多数情况下,这个数字应该足够了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-08
        • 2023-04-05
        相关资源
        最近更新 更多